2013-03-06 5 views
18

Ist es möglich, zu verwenden, um DbContext Entity Framework global gesetzt datetime2 für alle Eigenschaften zu verwenden, die System.DateTime sind, wenn-Code-First-Modell?Force-Entity Framework 5 datetime2 Datentyp

Ich kann dies für jede Spalte mithilfe von HasColumnType() Methode, aber für eine vorhandene Codebasis möchte ich eine globale Lösung.

+0

Einfach nur neugierig, warum wollen Sie dies tun. Der Grund, warum ich frage, ist, dass es ein sehr häufiger Fehler ist, wenn versucht wird, eine Entität zu committen, die einen Standardwert für eine nicht nullable DateTime-Spalte (DateTime.MinVal) hat. Die Ausnahme gibt an, dass Sie eine DateTime2-Spalte verwenden sollten. Dies ist jedoch meist irreführend, es sei denn, Sie benötigen die zusätzliche Genauigkeit. Die Fehlerbehebung besteht darin, entweder einen nicht standardmäßigen Wert für das DateTime-Feld zuzuweisen oder es als Nullwert zu definieren. Hoffe das hilft. –

+0

@ w.brian 1) Wir haben eine Tabelle, die Kunstwerke und Autoren speichert, wo beide vor 1753 gemacht/geboren werden können ... 2) Wenn dies möglich wäre, wäre es eine Alternative für min Datum Validierung für jeden anderen Feld. 3) technische Neugier ... –

+0

Gotcha. Ich wollte nur sichergehen, dass Sie nicht den falschen Baum anbellen, wie ich es ursprünglich getan habe, als ich auf die oben erwähnte Ausnahme stieß. –

Antwort

25

Da EF6 schon länger aus ist und diese Frage immer noch in Suchen auftaucht, können Sie hier den SQL-Typ mithilfe benutzerdefinierter Konventionen festlegen. Innerhalb OnModelCreating Methode in Ihrer Klasse DbContext tun:

modelBuilder.Properties<DateTime>() 
    .Configure(c => c.HasColumnType("datetime2")); 
+0

Ist dies nur für neues Modal? weil ich diese Fehlermeldung auf Update-Datenbank erhalten habe: ALTER TABLE ALTER COLUMN Datum fehlgeschlagen, weil ein oder mehrere Objekte auf diese Spalte zugreifen. – Jacob

+1

@Jacob Meinst du es funktioniert, wenn Sie bereits die Datenbank für das Modell erstellt haben? Ja, aber Sie müssen daran denken, nach dem Hinzufügen der Konvention zu OnModelCreating eine Migration zu erstellen. Dies ist, wie ich es getan habe, so weiß ich, dass es funktioniert, wenn richtig gemacht :) –

+1

Ich hatte den Fehler aufgrund der Tabellen Einschränkungen. Ich löste es, indem ich sie gemäß dieser Antwort manuell löschte: https://stackoverflow.com/a/19461205/665783 Ihre Antwort half uns jedoch sehr. Wir haben unsere gesamte Datenbank nach dem von Ihnen geposteten Code migriert. Vielen Dank! – Jacob

7

Nicht in EF5 sondern in EF6 (derzeit in Alpha-Version) dies mit custom conventions zulassen. Für EF5 benötigen Sie ein benutzerdefiniertes, auf Konventionen basierendes Framework, das auf Reflektion basiert und HasColumnType Aufrufe an den Modellersteller durch Reflektion hinzufügt - beispielsweise EF Code First Extras (es behauptet, Unterstützung für steckbare Konventionen zu haben).