我有以下C#类:
public class SomeClass{
public string Name;
public List<SomeClass> List1;
public List<SomeClass> List2;
}
当我有2个SomeClass实例(SomeClass1和SomeClass2)并做类似的事情时:
SomeClass1.List1.Add(SomeClass2);
当调用context.SaveChanges()时,由于某种原因,它还将SomeClass1添加到SomeClass2.List2。我该如何防止这种情况?
编辑:我先使用代码。 感谢
答案 0 :(得分:1)
如果您没有使用Fluent API进行任何映射,EF将根据约定创建映射。在这种情况下的约定是List1
和List2
是相同关系的逆导航属性 - 在这种情况下是“自引用”多对多关系
您遇到的效果是自动关系修正,在调用DetectChanges()
时执行(或SaveChanges()
在内部调用DetectChanges()
)。此修正自动更新附加实体的反向导航属性,以使它们彼此一致。你不能阻止它,它实际上不应该是一个问题。
修改强>
如果您不想在两个列表之间进行映射,则必须使用Fluent API指定显式映射。例如:如果两个列表都属于单独的一对多关系,则必须指定:
modelBuilder.Entity<SomeClass>()
.HasMany(s => s.List1)
.WithRequired() // or WithOptional()
.WillCascadeOnDelete(false);
modelBuilder.Entity<SomeClass>()
.HasMany(s => s.List2)
.WithRequired() // or WithOptional()
.WillCascadeOnDelete(false);
此映射表示每个关系的第二端未在模型中公开(因此WithRequired()
/ WithOptional()
没有参数)。
类似地,您可以使用HasMany(s => s.List1/2).WithMany().Map(...)
指定两个多对多关系。