5 Stimmen

Verwendung des SQL-Spaltentyps uniqueidentifier mit Entity Framework

Für meinen Primärschlüssel und die Identität in unserer Kundentabelle verwende ich uniqueidentifier Spalte mit einem Standardwert, der auf newsequentialid() gesetzt ist. Das Einfügen neuer Zeilen über das Verwaltungstool erzeugt die Werte für die ID fine.

Das Einfügen von .NET 4-Code über EF führt dazu, dass null GUIDs (00000-0000....) eingefügt werden. Ich erstelle die Entität mit new, setze einige Werte und führe EF AddToClients (zum Beispiel). Beim Debuggen zeigt der Wert für die id-Eigenschaft null GUID an. Ich setze die id nicht explizit über die Guid.NewGuid() in meinem Code, denn ich möchte es dem Kunden überlassen newsequentialid() in SQL Server. Das Problem ist, dass es nicht funktioniert. Beim ersten Mal, wenn der Code ausgeführt wird, wird eine Zeile mit einer GUID von Null eingefügt. Beim nächsten Mal schlägt er offensichtlich fehl und führt zu einer Ausnahme wegen Primärschlüsselverletzung.

Wie kann ich dies erreichen, ohne die GUID in meinem Client-Code festlegen zu müssen?

12voto

Adam Robinson Punkte 176996

Sie müssen die StoreGeneratedPattern Wert für die Eigenschaft im EF-Designer. Setzen Sie ihn auf Identity . Dadurch vermeidet EF das Setzen des Wertes bei einer Einfügung und erfasst ihn erst, nachdem die Einfügung abgeschlossen ist.

Beachten Sie, dass Sie, wenn Sie EF 4 verwenden, Probleme haben könnten, wenn Sie nur den Designer verwenden (siehe dieser Link ). Möglicherweise müssen Sie die .edmx-Datei manuell bearbeiten und die StoreGeneratedPattern im Speichermodell selbst.

0voto

Donnie Hale Punkte 371

Ich bin auf das gleiche Problem gestoßen. Es ist eine echte Qual. Hier ist eine Seite darüber, mit Kommentaren von Microsoft - http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/aecf14e3-e4c9-439b-88af-23d4353afb9d .

Meine Abhilfe bestand darin, eine gespeicherte Prozedur zu erstellen, die für die INSERT verwendet wird. Auf dieser Seite finden Sie einige Informationen darüber, wie man das macht - http://thedatafarm.com/LearnEntityFramework/tutorials/using-stored-procedures-for-insert-update-amp-delete-in-an-entity-data-model/ . Bisher habe ich nur einen Insert Stored Proc - nichts für Update oder Delete; und im Gegensatz zu dem Artikel, ich bin nicht immer ein Modell Validierung Fehler.

KORREKTUR Mit EF konnte ich eine Liste von Entitäten abrufen, aber als ich eine Instanz einer bestimmten Entität abrufen wollte, erhielt ich die Fehlermeldung, dass eine Zuordnungsfunktion für Aktualisierungen fehlt. Igitt!

Um die eingefügte UUID abzurufen, die mit newsequentialid() generiert wurde, habe ich die Technik "OUTPUT INSERTED.[column]" verwendet, die mit SQL Server 2005 eingeführt wurde. Ein Beispiel finden Sie unter Abrufen der letzten mit Uniqueidentifier eingefügten Zeile, die nicht IDENTITY ist . Ich habe die gleiche Technik in der gespeicherten INSERT-Prozedur verwendet, um datetime-Spalten abzurufen, die mit einem Standard getdate() festgelegt wurden.

Ich hoffe, das hilft jemandem,

Donnie

0voto

VINICIUS SIN Punkte 1501

Klicken Sie mit der rechten Maustaste in Ihre .edmx. Öffnen Sie mit dem XML-Texteditor mit Kodierung oder einer anderen. Suchen Sie den id-Namen und fügen Sie das Attribut daneben im selben Tag hinzu: StoreGeneratedPattern="Identität".

Beispiel:

< Property Name="WorkerId" Type="uniqueidentifier" Nullable="false" StoreGeneratedPattern="Identity" />

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X