实体框架SaveChanges返回错误。 AddObject不设置主键

时间:2011-10-18 13:39:03

标签: c# entity-framework-4

我有一个Property表,另一个是Detail表。我使用断开连接的方法,其中添加了多个属性,然后当我们单击保存按钮时,它将保存对数据库的更改。这种不为每个添加的属性保存的方法是因为用户也可以从列表中删除。

这就是我正在做的事情

foreach (Property P in Results)
{
  if(P.PropertyId==0 && P.EntityState==EntityState.Added)
    Repository.Properties.AddObject(P);
}

但是当我尝试保存数据时

public void Save()
{
  Repository.SaveChanges();
}

它返回错误

  

无法确定'database.FK_Details_Property'的主要结尾   关系。多个添加的实体可能具有相同的主键。

我认为是因为每次调用AddObject时它的主键都是0,我不知道什么可以解决这个问题。对于遇到它的人来说,这是否相似或听起来很熟悉?

提前致谢

4 个答案:

答案 0 :(得分:2)

这里有明确的标识栏。

假设您使用的是MS SQL 请检查您正在插入的表格以及任何相关的表格

1)身份规范=是

2)Identity = YES

3)身份增量= 1

4)身份种子= 1

它肯定会为你插入PK,所以你需要环顾四周。确保您也检查子表。 如果您仍然遇到问题且未使用代码优先方法,请尝试在EDMX中重新生成这些表。

答案 1 :(得分:0)

1)您可能想要检查循环依赖关系。它可能在两个实体之间保存产品与详细实体或反之亦然

点击此处:http://social.msdn.microsoft.com/Forums/sk/adodotnetentityframework/thread/5ba666ff-0103-4a83-b4d0-743c16a99491

2)添加Repository.Properties.AddObject(P)时要小心;因为在P实体后面的代码中仍然有对Detail表的引用。

确保与细节相关的实体尚未保存链接到它的对象。

如果Detail对象有3个属性,当您保存Detail时,您还将保存3个属性。

答案 2 :(得分:0)

只需在代码中替换此代码:

foreach (Property P in Results)
{
  if(P.PropertyId==0 && P.EntityState==EntityState.Added)
  {
    var id = Repository.Properties.Max(p => (int?)p.PropertyId) ?? 0;
    P.PropertyId=++id;
    Repository.Properties.AddObject(P);
    Repository.SaveChanges();
  }
}

当然在文件的第一行添加:

using System.Linq;

用于多线程:

foreach (Property P in Results)
{
  if(P.PropertyId==0 && P.EntityState==EntityState.Added)
  {
       while(true){
         try{
            var id = Repository.Properties.Max(p => (int?)p.PropertyId) ?? 0;
            P.PropertyId=++id;
            Repository.Properties.AddObject(P);
            Repository.SaveChanges();
            break;
         }catch{
              continue;
         }
       }
  }
}

当然最好先创建'property'对象的新实例,然后按字段varible分配字段,然后调用AddObject和SaveChanged!

答案 3 :(得分:0)

Guid适用于允许您在没有数据库的情况下创建唯一ID。

如果您使用int,则需要确保您在edmx模型中为主键列“存储生成”。