[英]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.