【问题标题】:C# Unable to determine the principal end of the relationshipC# 无法确定关系的主体端
【发布时间】:2012-08-09 23:59:54
【问题描述】:
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 }); 但我可能是错的,有什么想法可以解决它吗?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

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

    尝试将 item.MyFile.Add(new MyFile { FileID = newFile.FileID }); 行更改为:

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

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

    【讨论】:

      【解决方案2】:

      这可能是因为您在 EDMX 中循环引用同一个表。

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

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

      谢谢,

      毕斌。

      【讨论】:

      • 所以你的意思是不要包括自我参考?
      • 您不必删除引用,如果递归或循环引用是您的架构的一部分,则将其保留。只要确保它是可选的,不是必需的(可为空的),那么它就是一个完全有效的结构。此答案表明您损害了数据的完整性。
      猜你喜欢
      • 1970-01-01
      • 2018-09-30
      • 2013-05-07
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 2016-06-14
      相关资源
      最近更新 更多