C#无法确定关系的主要结束

时间:2012-08-09 23:59:55

标签: c# entity-framework

foreach (var item in order.MyFiles)
{
   var newFile = adapter.db.File.CreateObject();

   newFile.Name = item.FileName;

   adapter.db.File.AddObject(newFile);

   adapter.db.SaveChanges();

   item.MyFile.Add(new MyFile { FileID = newFile.FileID });

   adapter.db.SaveChanges();
}

foreach (var item in tempFilesList)
{
    adapter.db.DeleteObject(item);
}

adapter.db.SaveChanges();

该代码复制MyFile表中的行,例如,如果循环迭代3次,我看到6行(3 x 2 * adapter.db.SaveChanges() ???)

但是,如果我只有一个adapter.db.SaveChanges();(最后一个),我会收到错误

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

我认为这是因为在这种情况下它不会提交adapter.db.File.AddObject(newFile);项目,然后再将它们交给item.MyFile.Add(new MyFile { FileID = newFile.FileID });但是我可能错了,任何想法如何解决它?

2 个答案:

答案 0 :(得分:50)

在保存更改之前定义新的newFile.FileID时,您无法使用MyFile。在将新实体保存在数据库中之前,FileID是默认值(0)。您必须在File课程中使用MyFile的导航属性。 EF将检测关系并适当地提交数据。

尝试使用以下内容更改行item.MyFile.Add(new MyFile { FileID = newFile.FileID });

item.MyFile.Add(new MyFile { File = newFile });  

其中FileMyFile实体中定义的导航属性。

答案 1 :(得分:3)

这可能是因为EDMX中的循环引用返回到同一个表。

例如,如果EmployeeDepartment是您要更新的表,主键是EmployeeDepartmentID,如果它是标识列并自动生成,请在EDMX中签入是否将EmployeeDepartmentID引用回自身。如果是这样,请右键单击该foreigh键引用,然后单击“删除”。

这对我有用,我希望这也适合你。

谢谢,

Bibin。