我有几个类,我需要从一个持有Id的普通基类派生.暂时忽略其中的一个,让我们说:
public class MyBase {
[Key]
public int Id { get; set; }
}
public class MyName : MyBase {
public string Name { get; set; }
}
我的上下文(DataContext)如下所示:
public DbSetMyNames { 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()
.Property(c => c.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
modelBuilder.Entity()
.Map(m => {
m.MapInheritedProperties();
m.ToTable("MyNames");
});
}
结果DB,当我启用迁移,添加迁移初始和更新数据库是我没有名为MyBase的表,而是我得到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)但不是第二次… Jimmy获得了DUPLICATE KEY异常.注意(为了全面披露)我实际上在我的代码的另一部分中创建了jj和jh对象,然后将它们作为MyBase对象传递到这个方法(上面)中,然后将它们重命名为MyName对象,如果它们是这样的.我希望这不是一个问题.
我猜,如果一切都在一个表中,则可以将Id标识为身份,并使用@@ IDENTITY来分配对象Id值.也许我将需要创建一个MyBases表,然后先创建该记录,然后将该Id重复到事务中的派生表中.这是最好的方法?
任何帮助这个EF6 CodeFirst新手将不胜感激.谢谢.