【问题标题】:Table-per-type inheritance insert problemTable-per-type 继承插入问题
【发布时间】:2011-01-30 02:27:28
【问题描述】:

我按照this article 为我的实体创建了一个表类型继承模型,但是当我尝试将子类的实例添加到数据库时出现以下错误。

这是我创建子类型的方法:

var cust = db.Users.CreateObject<Customer>(); // Customer inherits User
db.Users.AddObject(cust);
db.SaveChanges();

我在最后一次调用时收到以下错误:

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

有以下内部异常:

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

关于我可能缺少什么的任何想法?

使用重现步骤更新

创建了一个空白的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();
}

我得到了与上面描述的相同的异常。请让我知道这个复制品是否适合您,如果可以,我做错了什么。我在这个问题上被阻止了。

【问题讨论】:

  • 该示例没有 Customer 类,因此您可能需要为任何人提供更多代码来帮助您。

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


【解决方案1】:

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

【讨论】:

  • 我对 Id 属性有类似的问题,在 DB 中:在基类中它是身份。在继承的类中,它是唯一的,具有基的外键。除非我在实体中设置 Id 值,否则我会收到插入错误。为什么这是错的?你能解释一下为什么这里不允许使用身份吗?谢谢
【解决方案2】:

ObjectContext.CreateObject() 既创建 T 的实例,又将该实例添加到调用 CreateObject() 的 ObjectContext 实例中。因此,您对 AddObject() 的显式调用失败,因为已存在具有相同键的 Customer 对象。正确的代码是:

var cust = db.Users.CreateOjbect<Customer>();
// modify any properties on the customer instance
db.SaveChanges();

【讨论】:

  • 没有骰子,数据库还是空的。我也尝试过:var cust = new Customer();
  • 你为什么还要使用CreateObject?你就不能做var cust = new Customer(); db.Users.AddObject(cust);
  • 我就是这个意思,我也试过了。我相信这两种方式的效果是一样的。
【解决方案3】:

在我的情况下,问题是我们代码的遗留部分在 EntityTypeConfiguration 中使用了 Map,我向 Item 添加了一个属性,导致 EF 将 Item 实体拆分为两个表:dbo.Item 和 dbo.Item1。解决方案是在数据库中查看 Item1 表中的属性并将它们添加到显式映射中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多