2010-11-08 96 views
4

對於我的LINQ對象Foo,我希望有一個「之前和之後」的狀態包圍我的對象變化(來自ASP.NET MVC UpdateModel()調用)。我的想法是將附加實例的預突變屬性複製到新的未附加實例中。然後,我可以在附加實例中進行更新,並將它們的值與未附加實例中的值進行比較。像這樣:避免在LINQ中保存對象

Foo real = context.Foos.First(aFoo => aFoo.ID == id) 
Foo old = new Foo(); 
old.Bar = real.Bar; 
old.Baz = real.Baz; 
SomeSortOfUpdate(real); 
if (!real.Bar.Equals(old.Bar) || real.Baz.Equals(old.Baz)) { 
    LogChanges(old, real); 
} 
context.SubmitChanges(); 

這裏的問題:由「富老」引用的對象得到保存(插入)期間context.SubmitChanges()。我追溯到LINQ到SQL關聯的屬性的分配。

因此,例如,如果Baz是支持表格的L2S生成類型(包括old.Baz = real.Baz),則除的任何SQL更新之外,還將導致old的SQL插入。刪除它(但保持old.Bar)使事情按我的預期工作。

我猜這是因爲Foo.Baz賦值使可保存對象圖中Foo和Baz之間的鏈接。由於real正在保存,因此LINQ還會遍歷所有關聯的對象並查找更改。 real.Baz本身並未發生變化,但它與old有一個新的關聯,它尚未保存,因此被SubmitChanges調用所困擾。

有什麼辦法可以阻止圖中的對象被保存嗎?

回答

-1

我不知道這是什麼會做

var old = (Foo)real; 

我不知道是否該實例本身創建連接

+0

不,這只是對同一個實例的另一個引用。這對於確定新舊國家之間的差異並不符合我的目的。 – 2010-11-08 16:34:17

2

你的分析是正確的。您的任務正在建立鏈接。

您可以修改生成的代碼來不這樣做(或自己寫)。但這意味着你必須沒有自動生成的實體類。我個人認爲這是不可接受的。

爲什麼不將序列化前圖像對象到字典中?或者將其屬性值複製到一個自定義的DTO類中?

從你的代碼我可以告訴你想要舊的值做更改日誌記錄。你可以使用

DataContext.GetTable<T>().GetModifiedMembers(entity)