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.
Puoi pubblicare lo schema generato/DDL? –