2013-07-18 14 views
6

Nei miei modelli con codice EF5, la creazione di nuovi record funziona meglio se il database imposta la chiave primaria. Sto usando un Guid per la chiave primaria e se è impostato DatabaseGeneratedOption.Identity, SQL Server creerà sempre il uniqueidentifier.Come gestire la chiave primaria in Entity Framework 5 Codice prima

Tuttavia, questo causa problemi quando si tenta di inizializzare il database inizialmente. Se imposto il Guid nel mio metodo seed, SQL Server lo sostituisce. Se non imposto il Guid, ottengo un nuovo record ogni volta. Qual è la soluzione consigliata per effettuare il seeding del database utilizzando Guids pre-impostati e mantenere DatabaseGeneratedOption.Identity impostato per le mie normali operazioni?

Esempio modello di classe:

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public Guid Id { get; set; } 
public RecordName { get; set; } 
public DateTime? Created { get; set; } 
public DateTime? Updated { get; set; } 

metodo seme Esempio:

var record = new Record() 
      { 
       Id = new Guid("3B80725E-9550-4933-807F-C2FAA0942225"), 
       RecordName = "New Record", 
       Created = DateTime.UtcNow, 
       Updated = DateTime.UtcNow, 
      }; 
context.Record.AddOrUpdate(record); 
context.SaveChanges(); 

risposta

8

AddOrUpdate ha un sovraccarico che consente di specificare la chiave

Da MSDN

Quindi è necessario per fornire il metodo con la chiave naturale:

context.Record.AddOrUpdate(c => c.RecordName, new Record() 
      { 
       RecordName = "New Record", 
       Created = DateTime.UtcNow, 
       Updated = DateTime.UtcNow, 
      }) 
+0

Impressionante. Non conoscevo il metodo di estensione aggiuntivo. La chiave naturale funziona alla grande per gli aggiornamenti. Sfortunatamente con [DatabaseGenerated (DatabaseGeneratedOption.Identity)] presumo che non ci sia un modo per scavalcare il Guid/Id per il nuovo record? – roadsunknown

+0

Ne dubito. Quando ho bisogno dell'ID inserito durante il seeding, faccio questo: var organization = new Organization {Name = "Demo"}; context.Organisations.AddOrUpdate (o => o.Name, organizzazione); SeedMembership (organisation.ID); – Colin

Problemi correlati