2010-05-13 12 views
9

Ich habe eine SQL Server 2008-Datenbanktabelle, die Uniqueidentifier als Primärschlüssel verwendet. Bei Einfügungen wird der Schlüssel auf der Datenbankseite mithilfe der Funktion newid() generiert.Entity Framework - SaveChanges mit GUID als EntityKey

Dies funktioniert gut mit ADO.NET. Aber wenn ich diese Tabelle als Entität in einem Entity Framework 4-Modell aufstelle, gibt es ein Problem. Ich bin in der Lage, die Entität gut abzufragen, aber beim Erstellen einer neuen Entität und dem Aufruf von SaveChanges() für den Kontext ist der generierte Uniqueidentifier in der Datenbank nur Nullen.

Ich verstehe, es gab ein Problem mit EF V1, wo dieses Szenario nicht funktionierte, die Erstellung der GUID auf dem Client vor dem Aufruf SaveChanges. Allerdings hatte ich an vielen Stellen gelesen, dass sie vorhatten, dies in EF 4 zu beheben.

Meine Frage - wird dieses Szenario (DB-Seitengenerierung von uniqueidentifier) ​​immer noch nicht in EF4 unterstützt? Sind wir immer noch dabei, die GUID auf dem Client zu generieren?

+0

Nur aus Neugier, warum fühlen Sie sich auf dem Client „stecken“ mit Erzeugen der GUID sind? Dies ist der primäre Vorteil von uniqueidentifier, IMO. Wenn Sie IDs auf dem Server generieren möchten, verwenden Sie einfach einen Autoinkrement-Schlüssel. – MusiGenesis

+0

Großer Spitzname, übrigens. :) – MusiGenesis

+0

@MusiGenesis, 1. MissingLinq will einen automatisch generierten Schlüssel, nur nicht ein int (vielleicht weil sie mehr begrenzte Bereiche haben). 2. Der Punkt der Datenbank generierten Schlüssel ist die Beseitigung von Kollisionen, mit einer GUID die Chance, die kann 1/2^128 sein, aber warum nicht lassen Sie die Datenbank tun, und lassen Sie den Client-Code nur sorgen über die Schaffung der Entitäten und nicht über Datenbankschlüssel. –

Antwort

4

Ja, dies wurde in EF 4 geändert. You can now use a server generated GUID. @MusiGenesis, servergenerierte GUIDs haben einige Vorteile; sie können sequentiell sein, z.B.

+0

Craig - Ich habe diesen Link gesehen. Es besagt, dass "der Anbieter den servergenerierten Identitätswert nach dem Einfügen einer Zeile zurückgeben kann. SQL Server kann den vom Server generierten GUID-Typ über die OUTPUT-Klausel ab SQL Server 2005 zurückgeben." Dies scheint mir anzuzeigen, dass eine gespeicherte Prozedur erforderlich wäre. Ich wollte eigentlich wissen, ob dies nativ unterstützt wird, und wenn ja, warum bekomme ich einen "null" (all-zeros) Bezeichner? – MissingLinq

+0

Nein, [OUTPUT funktioniert mit INSERT] (http://msdn.microsoft.com/en-us/library/ms174335.aspx). Sehen Sie sich das generierte INSERT an und vergewissern Sie sich, dass es OUTPUT> –

Verwandte Themen