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