Laden...

[gelöst] NEWGUID() mit EntityFramework

Erstellt von Cannon vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.600 Views
C
Cannon Themenstarter:in
282 Beiträge seit 2008
vor 11 Jahren
[gelöst] NEWGUID() mit EntityFramework

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.

795 Beiträge seit 2006
vor 11 Jahren
`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
C
Cannon Themenstarter:in
282 Beiträge seit 2008
vor 11 Jahren

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.

S
44 Beiträge seit 2012
vor 11 Jahren

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

C
Cannon Themenstarter:in
282 Beiträge seit 2008
vor 11 Jahren

@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.

16.834 Beiträge seit 2008
vor 11 Jahren

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)

T
94 Beiträge seit 2007
vor 11 Jahren

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.

C
Cannon Themenstarter:in
282 Beiträge seit 2008
vor 11 Jahren

@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...