实体框架奇怪的映射

时间:2012-03-19 17:13:10

标签: c# entity-framework

我有以下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。我该如何防止这种情况?

编辑:我先使用代码。 感谢

1 个答案:

答案 0 :(得分:1)

如果您没有使用Fluent API进行任何映射,EF将根据约定创建映射。在这种情况下的约定是List1List2是相同关系的导航属性 - 在这种情况下是“自引用”多对多关系

您遇到的效果是自动关系修正,在调用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(...)指定两个多对多关系。