抱歉,首先让我说我确实尝试在线搜索此问题,但有一些但与我的情景没有特别相关。我花了几个小时才弄清楚。
我在下面发布我的代码,删除所有无关的信息
首先,这是我的课程
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这样的孩子有父母)
答案 0 :(得分:0)
因为没有人回答。发布我发现的内容,以防它可以帮助任何人。
在StudentParentMap中,添加
m => m.Parent
这样
HasMany(m => m.StudentParents).WithRequired(m => m.Parent).HasForeignKey(m => m.ParentId).WillCascadeOnDelete(false);
不确定为什么这很重要..映射似乎足够了,以至于代码优先生成的数据库关系没有随着这个新增加而改变。但是,EF需要知道如何在多个记录添加事务期间配置FK。这对我来说非常微妙。