Toolroom Tech Blog

Devlopers Digest

datetime vs. datetime2 im Entity Framework

Nimm datetime2

Ich bin bei der Arbeit mit dem EntityFramework 4 und SQL Server 2008 gerade wieder über eine erstmal seltsam klingende Fehlermeldung gerattert:

System.Data.SqlClient.SqlException : The conversion of a datetime2 
data type to a datetime data type resulted in an out-of-range value.

Die Erklärung dafür ist relativ einfach: Der Datentyp datetime ist in manchen Dingen etwas limitiert. Beispielsweise ist es den Meisten wohl schon mal passiert, dass er den 01.01.0001 zumindest unbeabsichtigt in die Datenbank schreiben wollte. Microsoft hat daher eine Art Erweiterung des datetime Datentyps eingeführt ... der heisst datetime2 und verspricht einiges besser zu können als sein Vorfahr, indem er bessere Genauigkeit und eine größere Zeitspanne von 01.01.0001 bis 31.12.9999 einführt.

Und fein ist dabei, dass wir DateTime.Min jetzt auch in die Datenbank schicken können.

var min = DateTime.Min;
var max = DateTime.Max;

//min is equivalent to 00:00:00.0000000, January 1, 0001 
//max is 23:59:59.9999999, December 31, 9999, exactly one 100-nanosecond tick before 00:00:00, January 1, 10000

Mehr dazu gibt es auf TechNet und TechNet2.

Das Entity Framework verwendet vermutlich auch deswegen seit Version 4 datetime2 statt datetime. Wer nun aber mit der oben genannten SqlException kämpft aber die bestehende Datenbank nicht anpassen kann/will, kann im XML seines Entity Data Model files (*.edmx) das ProviderManifestToken von 2008 auf 2005 ändern, und schon wird wieder mit der alten Zeit (also datetime) gearbeitet.

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
  <!-- EF Runtime content -->
  <edmx:Runtime>
    <!-- SSDL content -->
    <edmx:StorageModels>
    <Schema Namespace="DBModel.Store" ProviderManifestToken="2005" Alias="Self" Provider="System.Data.SqlClient">
        <EntityContainer Name="DBModelStoreContainer">

So, ich muss jetzt wieder zurück in die Zukunft...