Ich gehe von einem vorhandenen Modell und einer Datenbank zu Entity Framework. In dieser Datenbank gibt es mehrere Tabellen mit GUID-Spalten, die keine Primärschlüssel (oder Schlüssel überhaupt) sind. Jede Tabelle hat eine ID-Spalte. In den GUID-Spalten ist die ROWGUIDCOL-Eigenschaft sowie eine DEFAULT (newid()) definiert.Automatisch generierte GUID-Spalte, die kein Primärschlüssel in Entity Framework ist
Jetzt, wenn ich in den DB einfügen, bekomme ich alle Nullen für diese Spalte.
Ich habe versucht, Daten Anmerkungen mit:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Guid {get; set;}
Das Problem dabei ist, dass es die Identität Eigenschaft auf meine ID-Spalte fällt (und gibt mir Fehler einfügen). Darüber hinaus bemerkte ich, dass die folgende Migration, EF erzeugt tatsächlich identisch SQL sowohl für die nach oben und unten Methoden:
public override void Up()
{
AlterColumn("dbo.Client", "Guid", c => c.Guid(nullable: false, identity: true));
}
public override void Down()
{
AlterColumn("dbo.Client", "Guid", c => c.Guid(nullable: false));
}
Mit dem generierten SQL aus:
ALTER TABLE [dbo].[Client] ALTER COLUMN [Guid] [uniqueidentifier] NOT NULL
Warum die obige Migration erstellen die gleiche SQL für beide Aussagen? Wie bekomme ich EF zum Generieren von GUIDs? Kann/muss ich das im Client (Code) Space machen? Wenn ich muss, wie kann ich Einzigartigkeit über Tabellen garantieren?
Ich weiß nicht EF, aber es scheint, dass Sie Identität Eigenschaft und Standardwert verwirren. Ein GUID-Datentyp kann die Eigenschaft "identity" in SQL Server nicht haben – jazzytomato
Ist Ihr Primärschlüssel mit dem Attribut [Key] versehen? – Keith
DatabaseGenerationOption.Identity sollte für Identitätsspalte verwendet werden. Haben Sie DatabaseGenerationOption.Computed stattdessen versucht? Es sollte verhindern, dass EF einen Wert sendet, wenn die Spalte eingefügt wird, und es sollte den db-generierten Wert richtig auf SaveChanges ziehen – ESG