2014-04-18 14 views
10

Ho diverse classi che ho bisogno di derivare da una classe base comune che detiene un Id. Ignorando il tutto, ma uno di questi per il momento, diciamo che abbiamo:EF6 CodeFirst La mia colonna [chiave] Id non si incrementa automaticamente come una colonna di identità deve

public class MyBase { 
    [Key] 
    public int Id { get; set; } 
} 
public class MyName : MyBase { 
    public string Name { get; set; } 
} 

mio contesto (DataContext) si presenta così:

public DbSet<MyName>MyNames { get; set; } 

// to avoid having EF make a MyBases table and instead map 
// MyBase.Id into MyNames and my other derived classes I do this ... 

protected override void OnModelCreating((DbModelBuilder modelBuilder) { 
    modelBuilder.Entity<MyBase>() 
      .Property(c => c.Id) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

    modelBuilder.Entity<MyName>() 
      .Map(m => { 
        m.MapInheritedProperties(); 
        m.ToTable("MyNames"); 
       }); 
} 

La risultante DB, quando ho Enable-Migrazioni, Aggiungi -Migration iniziale, e Update-Database è che ottengo nessun tavolo chiamato MyBases, ma invece ho la colonna ID nella MyNames

dbo.MyNames 
    ----------- 
    Id (PK, int, not null) 
    Name (nvarchar(max), null) 

Fin qui tutto bene, tutto questo compila e costruisce, e poi ho testarlo utilizzando qualcosa di simile al seguente:

using (DataContext dc = new DataContext()) { 
     var jj = new MyName { Name = "Janice Joplin" }; 
     dc.MyNames.Add(jj); 
     dc.SaveChanges(); 

     var jh = new MyName { Name = "Jimmy Hendrix" }; 
     dc.MyNames.Add(jh); 
     dc.SaveChanges(); 
    } 

Questo funziona la prima volta (Janice si aggiunge con id = 0), ma non la seconda ... Jimmy ottiene un'eccezione chiave duplicato. Nota (per la divulgazione completa) Sto creando gli oggetti jj e jh in un'altra parte del mio codice, quindi li passo in questo metodo (sopra) come oggetti MyBase, quindi li rimando agli oggetti MyName se questo è quello che sono. Spero che non sia un problema.

Suppongo che se tutto fosse in una tabella, l'ID potrebbe essere contrassegnato come Identità e @@ IDENTITY potrebbe essere utilizzato per assegnare il valore Id dell'oggetto. Forse, dopo tutto, dovrò creare una tabella MyBases e creare prima quel record, quindi duplicare l'Id nelle tabelle derivate in una transazione. Qual è l'approccio migliore per questo?

Qualsiasi aiuto per questo principiante EF6, il primo novizio sarebbe apprezzato. GRAZIE.

+0

Puoi pubblicare lo schema generato/DDL? –

risposta

20

Mi ricordo quando ho usato per fare EF vorrei creare una tabella con identità e nella classe vorrei attribuire la colonna id con

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

così io parto dal presupposto che il codice dovrebbe essere

modelBuilder.Entity<MyBase>() 
     .Property(c => c.Id) 
     .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
+0

Ciò ha avuto l'effetto desiderato di creare la tabella MyBases. –

+0

Cosa usi adesso? –

+1

stranamente ho dovuto farlo per una classe di modello, ma non per gli altri. Ti odio EntityFramework. –

0

Credo che il problema risieda nel fatto che stai usando EF6 Code First Migrations. Quando lo fai, devi seminare il tuo DB usando il metodo .AddOrUpdate(). This Stack Overflow Question lo copre.

Problemi correlati