2010-09-23 59 views
2

這可能已經被問過,但我找不到它,所以在這裏。LinqToSql的關聯加載

我們使用Context.GetTable()對錶進行泛型讀取,然後附加表達式以在表中找到單個記錄。該表具有關聯。不幸的是,我們試圖改變一個關聯的領域,所以;

富是酒吧的父母對FooId

當我們要改變FooId,它的崩潰,因爲的EntityRef的HasAlreadyLoaded屬性設置爲true。除非我不太瞭解LinqToSql,否則我認爲這是在此記錄集上調用SingleOrDefault的行爲,它實際上正在觸發查詢並因此加載所有關聯的對象。

有沒有辦法阻止這種加載發生? (ObjectTrackingEnabled和DeferredLoading設置爲true),如果不是這個問題常見的解決方案是什麼?我們現在還不知道個人關係,我不想看看是否有可能找出關聯並根據ID加載它們。

我的首選方法本來是一個不太通用的方法,我可以完成.Foo = Context.Foo.Select(x => x.Id == FooId),但我們現在沒有那種奢侈。

回答

1

在LINQ to SQL中,要更新關聯屬性,必須將子對象從父母的父母的EntitySet<>移動到另一父母的EntitySet<>,並且在移動LINQ to SQL期間自動更新孩子的關聯屬性。

例如:

 // Get the source parent 
     Foo foo1 = context.Foos.Where(f => f.ID == 1).SingleOrDefault(); 
     Bar bar1 = foo1.Bars[0]; 

     // (Note: you don't necessarily need to get foo1 first - 
     // you could just get bar1 directly and proceed from here...) 

     // Get the destination parent 
     Foo foo2 = context.Foos.Where(f => f.ID == 2).SingleOrDefault(); 

     // Move the child over. LINQ to SQL automatically updates bar1.FooID from 1 to 2 here. 
     foo2.Bars.Add(bar1); 

     // Done. 
     context.SubmitChanges();