verwendetes Datenbanksystem: SQL-Server 2012, Entity Framework 5.0
Ich wollte meien Datenbank in Vorbereitung auf ein verteiltes System mit GUIDs umstellen. Allerdings funktioniert das Ganze nicht wie erwartet.
CREATE TABLE [dbo].[Employees] (
[EmployeeId] UNIQUEIDENTIFIER DEFAULT (newsequentialid()) NOT NULL,
[LastName] VARCHAR (50) NULL,
[FirstName] VARCHAR (50) NULL,
.....
Die Id ist immer "00000000-0000-0000-0000-000000000000", wenn die Datenbank vom Framework beschrieben wird. Manuell geht es. Demnach kann ich davon ausgehen, dass newsequentialid() und auch newid() nicht funktioniert und ich die Id manuell generieren muss? Oder gibt es eine andere Lösung mit dem ETF.
Um das zu finden, muss man schon ein bisschen länger suchen und probieren, denn auch die Lösungsvorschläge funktionierten nicht so recht. Aber die Lösung ist denkbar einfach und jetzt geht es. Allerdings kann ich das nur fürs Entity Framework 5 bestätigen:
Das Property "StoreGeneratedPattern" der Identitätsspalte muss manuell auf "Identity" eingestellt werden. Dann geht es auch.
Ich hab das bei mir so gelöst, dass jede Entität von einer Basisentität erbt. Diese Basisentität enthält eine Eigenschaft "ID" vom Typ GUID. Im Konstruktor der Basisentität kann der Wert für die Eigenschaft bequem gesetzt werden.
Ich habe so den Vorteil, dass ich alles selber in der Hand habe und die Basisentität mit zusätzlichen Eigenschaften (angelegt am, editiert am, angelegt von, etc.) erweitert werden kann.
Gruss
superVisor
@SuperVisor:
Das bedeutet aber auch, dass Du jede neue Entität per Hand zufügen musst?! Das macht für mich der EntityBuilder oder wie der heißt aus dem ETF 5.
Hand anlegen muss man aber dennoch, denn einige Sachen muss man sowieso zufügen, z.B. IDataErrorInfo.
Naja GUID auf dem Client erstellen ist nicht doof; kann sogar im Hinblick auf Kollisionen und Performance deutlich besser sein.
Ich gehe insgesamt sehr sehr ähnlich zu SuperVisor vor (wenn auch nicht mehr mit dem EF)
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Noch eine kurze Anmerkung zu allen Beiträgen.
Es muss unterschieden werden, ob die ID mittels NEWID() oder NEWSEQUENTIALID() erzeugt werden soll. Im Falle NEWID() ist es kein Problem, die ID auf dem Client zu erzeugen. Im Falle NEWSEQUENTIALID() geht das eben nicht, wobei diese Art und Weise auch mitunter den entscheidenden Vorteil hat, dass der Index nicht so schnell fragmentiert.
Falls für die Tabelle einige Millionen Datensätze pro Tag erzeugt werden sollten, ist der Datentyp GUID aus meiner Sicht eh nur dann sinnvoll, wenn die ID mittels NEWSEQUENTIALID() erzeugt wird aufgrund des Fragmentierungsproblems. Bei Massendaten würde ich immer INT(autoincrement) als Datentyp bevorzugen.
@tabstop: Aber spätestens dann, wenn ich die Daten synchronisieren will, habe ich mit der normalen INT ein Problem ..... sonst würde ich mir die Mühe mit der GUID nicht machen...