2009-10-22 5 views
12

In meiner SQL-Schema-Server-Datenbank I eine Datentabelle mit einem Datumsfeld hat, das einen Standardwert vonWie wird den Standard Entity Framework und Standarddatum verwenden Werte

CONVERT(VARCHAR(10), GETDATE(), 111) 

enthält, die für die automatische Einfügen von Datum ideal ist in den neuen Datensatz bei der manuellen Eingabe von Datensätzen in die Datenbank.

Das Problem, das ich habe, ist, dass das Entity Framework bei der Verwendung des Entity Framework und der Zuordnung des Datumsfelds einen Standardwert von DateTime.Min einfügt, wenn die Entität instanziiert wird.

Ich kann das Date-Feld nicht auf eine nullable DateTime, dh DateTime?, Abbilden, noch kann ich CONVERT oder DateTime.Now.Today im Standardwert des Entity Designers verwenden, da nur hartcodierte konstante Werte akzeptiert werden .

Ich kann natürlich das DateTime-Feld in C# immer explizit festlegen, wenn das Objekt erstellt wird, entweder explizit in Code, im Konstruktor einer partiellen Klasse oder sogar während des Ereignisses speichern Änderungen.

Gibt es andere Möglichkeiten, um das zu erreichen, was ich will, wenn stattdessen die in der Datenbanktabelle gespeicherte Vorgabewertberechnung verwendet wird?

+0

Sie könnten versuchen, das Feld als automatisch generierte festzulegen. Ich habe das nie ausprobiert und bin mir nicht sicher, wie gut es funktionieren würde. –

+0

Ich sah mich im EDM Designer um und sah keine Optionen, Menüpunkte oder Eigenschaften, die ich als das anbieten könnte. Wo finde ich "Set-Feld als automatisch generiert" im Designer? Ich nehme an, Sie beziehen sich auf den Designer, und nicht etwas in SQL Server. Oder vielleicht beziehen Sie sich auf "berechnete Spaltenspezifikation?" – Justin

+1

http://msdn.microsoft.com/en-us/library/dd296755.aspx –

Antwort

1

Ich bin gerade in diese - ich habe darum gearbeitet, indem Sie das Datum (das Feld, das ich benötigt, automatisch generiert) im Konstruktor der Entität mit einer partiellen Methode. Ob das Ideal ist oder ob es in allen Fällen funktioniert, ist noch zu sehen, aber es hat mein Problem bisher behoben.

+1

Dies ist die Lösung, die ich schließlich gewählt habe. Es scheint ein bisschen wie ein Klumper, aber es funktioniert einwandfrei. Schade, dass so ein Versehen in der EF vorliegt. – Justin

+0

Ich bin froh, dass ich geholfen habe, Hoffe, EF4 behebt dieses bisschen Schmerz. Wenn Sie denken, dass dies die beste Lösung ist, die Sie wahrscheinlich finden, dann markieren Sie sie als Antwort (oder zumindest Upvote), damit ich etwas Anerkennung bekomme - ich versuche mindestens genug Rep zu bauen, um diese Seite etwas aktiver zu nutzen . Vielen Dank! –

+1

Ich würde das tun, aber es erfordert 15 Ruf. Es tut uns leid. – Justin

5

Sie können eine database trigger verwenden, die beim Einfügen prüft, ob der eingefügte Wert DateTime.MinValue (01.01.0001) ist, und diesen durch den berechneten Wert ersetzt. Diese MSDN article beschreibt, wie Sie einen Trigger erstellen.

Ein kleiner "Fehler": Bei dieser Lösung müssten Sie das neue Objekt in der Datenbank speichern und anschließend zurücklesen, um Ihr Objekt mit dem berechneten Wert zu aktualisieren.

+2

Guter Punkt. Das würde auch funktionieren. Aber es fühlt sich an, als ob ich einen Vorschlaghammer schwinge, um eine Walnuss zu knacken. – Justin

0

Das Datumsfeld kann DateTime zugeordnet werden? Nur wenn die Spalte in der Datenbank nullfähig ist.

+0

Wenn die Spalte jedoch nullfähig ist, diktiert die Logik, dass Sie keinen "Standardwert" haben können. Und das ist das Verhalten, wie es vom SQL-Server gezeigt wird. – Justin

14

Erstellen Sie eine partielle Klasse für Ihr EntityObject, fügen Sie einen Standardkonstruktor hinzu und legen Sie darin Standardwerte fest.

public partial class YourDBObject 
    { 
      public YourDBObject() 
      { 
       this._DateField = DateTime.Now; 
      } 
    } 
+0

Genau das, was ich brauchte (aber nicht für diese Frage)! : D – nathanchere

+3

Danke. Das funktioniert, obwohl es mich zuerst verwirrt hat, weil der Konstruktor auch aufgerufen wird, wenn existierende Objekte aus der Datenbank geholt werden - in diesen Fällen wird jedoch die 'DateTime.Now' mit den Datenbankwerten nach der Konstruktion überschrieben. – codeulike

1

Ich hatte ein ähnliches Problem mit RIA Services mit dem Entity Framework. Ich konnte den Wert im Standardkonstruktor auf der Clientseite nicht festlegen, da die Entitätsklassen, die dort generiert werden, bereits einen leeren Standardkonstruktor haben.

Die Lösung, die ich verwendete, war die Implementierung der OnCreated partiellen Methode für die Entität auf dem Client durch Festlegen des erforderlichen Standardwerts.

2

Das ist wirklich bedauerlich. Die Antworten, die auf StoreGeneratedPattern verweisen, sind keine echte Lösung, die es Ihnen nicht erlaubt, den Wert jemals festzulegen.

das All Team würde tun müssen, ist so etwas:

[Required] 
    [DefaultValue] // suggested attribute, whatever you want to call it 
    public DateTime Created { get; set; } 

Wenn ein Feld Default markiert ist, dann wird bei SQL-Generierung Zeit EF, Eigenschaften mit diesem Attribut erhalten, wenn field == default(DateTime) geprüft, wenn ja, dann einfach diese Spalte aus dem generierten Code weglassen.

0

Gerade passiert dieses Problem durch. Entity Framework unterstützt keine Standardwerte. Sie müssen die Eigenschaft StoreGeneratedPattern = Berechnet für die Spalte in der Edmx-Dateientität festlegen. Der Standardwert, den Sie in der Datenbank festlegen, wird dann Vorrang haben, was EF standardmäßig festlegt, z. B. DateTime.Min