我有几个类需要从拥有 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");
});
}
当我启用迁移、添加迁移初始和更新数据库时,生成的数据库是我没有得到名为 MyBases 的表,而是得到了 MyNames 中的 Id 列
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();
}
这是第一次工作(添加 Janice 时 Id = 0),但是not第二个...吉米遇到重复密钥异常。请注意(为了充分披露),我实际上是在代码的另一部分中创建 jj 和 jh 对象,然后将它们作为 MyBase 对象传递到此方法(上面),然后将它们强制转换回 MyName 对象(如果它们就是这样的话)。我希望这不是问题。
我想如果所有内容都在一张表中,则 Id 可以标记为 Identity,并且 @@IDENTITY 可用于分配对象 Id 值。也许我最终需要创建一个 MyBases 表,并首先创建该记录,然后将 Id 复制到事务中的派生表中。最好的方法是什么?
对于这个 EF6 CodeFirst 新手的任何帮助,我们将不胜感激。谢谢。