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

本文关键字:设置 AddObject 错误 框架 SaveChanges 返回 实体 | 更新日期: 2023-09-27 18:11:40

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

这是我正在做的

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

但是当我试图保存数据

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

返回错误

无法确定数据库的主体端。FK_Details_Property '
的关系。多个添加的实体可以有相同的主键。

我认为这是因为每次我调用AddObject它的主键是0我不知道什么可以解决这个问题。对于遇到过这种情况的人来说,这是相似的还是熟悉的?

Thanks in advance

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

与此相关的绝对标识列。

假设您使用MS SQL请检查你插入的表格及相关表格

1)标识规范= YES

2) Is Identity = YES

3) Identity Increment = 1

4) Identity Seed = 1

它肯定在为你插入PK,所以你需要看看那里。确保也检查了子表。如果您仍然有问题,并且没有使用代码优先方法,请尝试在EDMX中重新生成这些表。

1)你可能想要检查一个循环依赖。它可能位于两个实体Save Product和detail实体之间,反之亦然

查看这里: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个属性

Guid可以让你在没有数据库的情况下创建唯一的id。

如果您使用int,则需要确保在edmx模型中主键列为"Store Generated"

在你的代码中替换这段代码:

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"对象实例,然后逐个字段变量赋值,然后调用AddObject和savechange !