每个类型的表继承插入问题

时间:2011-02-01 06:43:27

标签: c# .net entity-framework-4

我跟着this article为我的实体制作了每个类型的表继承模型,但是我遇到了一些问题。下面我发布了一些步骤来重现我在最小环境中遇到的问题以排除其他因素。

首先,我使用以下两个表创建了一个新的MS SQL Server 2008 R2数据库:

用户

  • Id:bigint(PK并将其设置为标识列)
  • 名称:nvarchar(25)NOT NULL(无论如何,一些随机属性

客户

  • Id:bigint(PK,标识列和Users.Id上的FK)
  • 标题:nvarchar(25)NOT NULL(也是什么,一些随机属性)

接下来,我从数据库生成了.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();
}

当我拨打最后一个电话时,我收到以下错误:

“在多个位置生成跨实体或关联共享的值。检查映射是否将EntityKey拆分为多个存储生成的列。”

具有以下内部异常:

“已添加具有相同键的项目。”

关于我可能遗失的任何想法?

3 个答案:

答案 0 :(得分:3)

快速谷歌上的错误消息显示以下解决方案,也许它可以帮助您:

http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/4bfee3fd-4124-4c1d-811d-1a5419f495d4

  

我认为我明白了。该   Party子类型的表有它的   键列设置为自动生成键   价值,因为它是派生的,EF   想明确设定这个值。

您是否尝试从客户表中删除“身份”设置?那么它不会自动生成主键吗?

希望这有帮助。

答案 1 :(得分:2)

我终于找到了麻烦的根源。对于那些仍然感兴趣的人,在Customers表中,Id列不应该已经设置为表的标识列(尽管PK和FK依赖关系很好)。

答案 2 :(得分:0)

为什么您不想将外键(UserId)作为单独的列?也许它可以帮到你。 还尝试使用模型优先方法并在创建模型后生成db,如以下article中所述。