對於我的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
調用所困擾。
有什麼辦法可以阻止圖中的對象被保存嗎?
不,這只是對同一個實例的另一個引用。這對於確定新舊國家之間的差異並不符合我的目的。 – 2010-11-08 16:34:17