У меня есть несколько классов, которые мне нужно получить из общего базового класса, который содержит Id. Игнорируя все, кроме одного, на данный момент, скажем, у нас есть:
public class MyBase {
[Key]
public int Id { get; set; }
}
public class MyName : MyBase {
public string Name { get; set; }
}
мой контекст (DataContext) выглядит следующим образом:
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");
});
}
Результирующая БД, когда я Enable-Migrations, Add-Migration Initial и Update-Database - это то, что я не получаю таблицу под названием MyBases, но вместо этого получаю столбец Id в MyNames
dbo.MyNames
-----------
Id (PK, int, not null)
Name (nvarchar(max), null)
Пока все хорошо, все это компилируется и строит, а затем я тестирую его, используя что-то вроде следующего:
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();
}
Это работает впервые (Дженис добавляется с Id = 0), но не второй... Джимми получает исключение DUPLICATE KEY. Примечание (для полного раскрытия) Я на самом деле создаю объекты jj и jh в другой части моего кода, а затем передаю их в этот метод (выше) как объекты MyBase, а затем отбрасывая их обратно в объекты MyName, если это то, что они есть. Надеюсь, это не проблема.
Я предполагаю, что если все было в одной таблице, идентификатор может быть помечен как Identity, а @@IDENTITY можно использовать для назначения значения идентификатора объекта. Возможно, мне нужно будет создать таблицу MyBases и сначала создать эту запись, а затем дублировать идентификатор в производные таблицы в транзакции. Какой лучший подход для этого?
Любая помощь для этого EF6 CodeFirst-новичка будет оценена по достоинству. БЛАГОДАРЮ.