我跟着this article为我的实体制作了每个类型的表继承模型,但是当我尝试将一个子类的实例添加到数据库时,我收到以下错误。
以下是我创建子类型的方法:
var cust = db.Users.CreateObject<Customer>(); // Customer inherits User
db.Users.AddObject(cust);
db.SaveChanges();
当我拨打最后一个电话时,我收到以下错误:
“在多个位置生成跨实体或关联共享的值。检查映射是否将EntityKey拆分为多个存储生成的列。”
具有以下内部异常:
“已添加具有相同键的项目。”
关于我可能遗失的任何想法?
使用REPRO STEPS更新
创建了一个空白的MS SQL Server 2008 R2数据库,并添加了以下两个表:
接下来,我从数据库生成了.edmx实体模型,并按照顶部的链接逐字。也就是说,我删除了User和Customer之间的关联,将User设置为Customer的基类,从Customer实体中删除了Id属性,并确保Customer.Id列已映射到继承的User.Id属性。然后我运行了以下小程序:
using (var db = new EF_Test.testEntities())
{
var cust = db.Users.CreateObject<Customer>();
db.Users.AddObject(cust);
db.SaveChanges();
}
我得到了与上述相同的例外情况。如果这个repro对你有用,请告诉我,如果有,那我做错了。我在这个问题上被封锁了。
答案 0 :(得分:6)
我终于找到了麻烦的根源。对于那些仍然感兴趣的人,在Customers表中,Id列不应该已经设置为表的标识列(尽管PK和FK依赖关系很好)。
答案 1 :(得分:0)
ObjectContext.CreateObject()都创建了一个T实例,同时将该实例添加到调用CreateObject()的ObjectContext实例中。因此,您对AddObject()的显式调用失败,因为已存在具有相同键的Customer对象。正确的代码是:
var cust = db.Users.CreateOjbect<Customer>();
// modify any properties on the customer instance
db.SaveChanges();
答案 2 :(得分:0)
在我的情况下,问题是我们的代码的遗留部分在EntityTypeConfiguration中使用了Map,并且我向Item添加了一个属性,该属性导致EF将Item实体拆分为两个表:dbo.Item和dbo.Item1。解决方案是在Item1表中的属性中查找db并将它们添加到显式映射。