簡體   English   中英

在LINQ中避免對象保存

[英]Avoiding object saving in LINQ

對於我的LINQ對象Foo,我希望有一個“之前和之后”狀態包圍我的對象變異(來自ASP.NET MVC UpdateModel()調用)。 我的想法是將附加實例的預變異屬性復制到一個新的未連接實例中。 然后,我將能夠在附加的實例中進行更新,並將它們的值與未附加的實例中的值進行比較。 像這樣:

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();

這就是問題:“Foo old”引用的對象在context.SubmitChanges()期間被保存(插入context.SubmitChanges() 我將其追溯到LINQ-to-SQL關聯的屬性分配。

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

我猜這是因為Foo.Baz賦值在可保存對象圖中在Foo和Baz之間建立了鏈接。 由於real存檔,LINQ還會遍歷所有相關對象並查找更改。 real.Baz本身並沒有改變,但是它與old有一個新的關聯,它尚未保存,因此會被提交到SubmitChanges調用中。

有什么辦法可以防止圖表中的對象被保存嗎?

你的分析是正確的。 你的作業正在建立鏈接。

您可以修改生成的代碼以不執行此操作(或編寫您自己的代碼)。 但這意味着你必須沒有自動生成的實體類。 我個人認為這是不可接受的。

為什么不將前映像對象序列化為字典? 或者將其屬性值復制到自定義DTO類中?

從您的代碼我可以告訴您希望舊值更改日志記錄。 你可以使用

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

我想知道這會做什么

 var old = (Foo)real;

我想知道實例本身是否正在創建連接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM