2012-03-19 181 views
1

我有以下的C#类:实体框架奇怪映射

public class SomeClass{ 
    public string Name; 
    public List<SomeClass> List1; 
    public List<SomeClass> List2; 
} 

当我有SomeClass的(SomeClass1和SomeClass2)的2个实例,并做一些事情,如:

SomeClass1.List1.Add(SomeClass2); 

它还增加了SomeClass1到SomeClass2.List2出于某种原因调用context.SaveChanges()时。我怎样才能防止这一点?

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

+1

如果没有看到您创建的映射,则无法分辨。请提供。 – 2012-03-19 17:15:32

+0

它代码第一吗? – 2012-03-19 17:23:38

+0

这是代码第一。我忘了补充一点。 – Fritsie 2012-03-19 17:25:17

回答

1

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

你体验效果是这是当DetectChanges()被称为执行(或SaveChanges()这就要求DetectChanges()内部)自动关系修正。此修正会自动更新附加实体的逆向导航属性,以便它们彼此保持一致。你无法防止这一点,它实际上不应该是一个问题。

编辑

如果你不想让两个列表之间的映射,必须指定用流利的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(...)类似,您可以指定两个多对多关系。

+0

有什么方法可以撤销这种关系吗?我并不打算这些名单是彼此相反的。 – Fritsie 2012-03-19 20:16:55

+0

@Fritsie:看我的编辑。 – Slauma 2012-03-19 20:45:34