无法确定关系的主要结束,多个添加的实体可能具有相同的主键

时间:2016-03-02 03:26:35

标签: c# .net entity-framework-4 entity-framework-6 entity-framework-5

抱歉,首先让我说我确实尝试在线搜索此问题,但有一些但与我的情景没有特别相关。我花了几个小时才弄清楚。

我在下面发布我的代码,删除所有无关的信息

首先,这是我的课程

public class StudentDm
{
    public int Id { get; set; }
    public virtual List<StudentParentDm> StudentParents { get; set; }

    // other properties ...
}

// constructs a many to many relationship with some additional info in this model
public class StudentParentDm : EntityBaseDm
{
    public int Id { get; set; }
    public int StudentId { get; set; }
    public virtual StudentDm Student { get; set; }
    public int ParentId { get; set; }
    public virtual ParentDm Parent { get; set; }

    // other properties ...
}

public class ParentDm
{
    public int Id { get; set; }

    // other properties ...
}

映射:

public StudentMap()
{
    HasMany(m => m.StudentParents).WithRequired().HasForeignKey(m => m.StudentId).WillCascadeOnDelete(false);
}

public StudentParentMap()
{
    HasRequired(m => m.Student).WithMany().HasForeignKey(m => m.StudentId).WillCascadeOnDelete(false);
    HasRequired(m => m.Parent).WithMany().HasForeignKey(m => m.ParentId).WillCascadeOnDelete(false);
}

public ParentMap()
{
    HasMany(m => m.StudentParents).WithRequired().HasForeignKey(m => m.ParentId).WillCascadeOnDelete(false);
}

然后代码,我在这里尝试创建多个新的StudentParents,每个都有自己的新Parent,给学生。

foreach (StudentParentDm studentParent in studentParents) // foreach new studentParent
{
    StudentParentDm trackedStudentParent;
    if (studentParent.Id == 0)
    {
        trackedStudentParent = new StudentParentDm
        {
            Parent = new ParentDm()
        };

        // map from studentParent to trackedStudentParent, including the Parent
        // ...

        trackedStudent.StudentParents.Add(trackedStudentParent);
    } else 
    {
        // unimportant
    }
}

unitOfWork.Commit() // blows up with error message

然后我收到这条消息:

Unable to determine the principal end of the 'Cobro.BusinessObjects.DatabaseContextServices.ParentDm_StudentParents' relationship. Multiple added entities may have the same primary key.

只有当我尝试一次添加多个StudentParent时才会发生这种情况。我不确定为什么学生父母的数量会很重要?我想我的关系设置正确。

它也适用于添加多个StudentGrades,但区别在于StudentGrade模型是平的(没有像StudentParent这样的孩子有父母)

1 个答案:

答案 0 :(得分:0)

因为没有人回答。发布我发现的内容,以防它可以帮助任何人。

在StudentParentMap中,添加

m => m.Parent

这样

HasMany(m => m.StudentParents).WithRequired(m => m.Parent).HasForeignKey(m => m.ParentId).WillCascadeOnDelete(false);

不确定为什么这很重要..映射似乎足够了,以至于代码优先生成的数据库关系没有随着这个新增加而改变。但是,EF需要知道如何在多个记录添加事务期间配置FK。这对我来说非常微妙。