35
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 });但是我可能是错的,有什么想法可以解决它吗?

4

2 回答 2

53

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

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

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

实体中File定义的导航属性在哪里。MyFile

于 2012-08-10T00:15:42.640 回答
2

这可能是因为您在 EDMX 中对同一张表进行了循环引用。

例如,如果 EmployeeDepartment 是您要更新的表,并且主键是 EmployeeDepartmentID,并且如果它是标识列并且是自动生成的,则在 EDMX 中检查 EmployeeDepartmentID 是否被引用回自身。如果是这样,请右键单击该外键引用并单击删除。

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

谢谢,

比宾。

于 2014-02-07T22:05:00.630 回答