2012-03-19 184 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