加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 避免在LINQ中保存对象

发布时间:2020-12-15 21:12:25 所属栏目:百科 来源:网络整理
导读:对于我的LINQ对象Foo,我希望有一个“之前和之后”状态包围我的对象变异(来自ASP.NET MVC UpdateModel()调用).我的想法是将附加实例的预变异属性复制到一个新的未连接实例中.然后,我将能够在附加的实例中进行更新,并将它们的值与未附加的实例中的值进行比较.
对于我的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()期间被保存(插入).我将其追溯到LINQ-to-SQL关联的属性分配.

因此,例如,如果Baz是一个由表支持的L2S生成的类型,包括old.Baz = real.Baz将导致旧的SQL插入除了真实的任何SQL更新.删除它(但保持旧.Bar)使事情按预期工作.

我猜这是因为Foo.Baz赋值在可保存对象图中在Foo和Baz之间建立了链接.由于真实存档,LINQ还会遍历所有相关对象并查找更改. real.Baz本身并没有改变,但是它与old有一个新的关联,它尚未保存,因此会被提交到SubmitChanges调用中.

有什么办法可以防止图表中的对象被保存吗?

解决方法

你的分析是正确的.你的作业正在建立链接.

您可以修改生成的代码以不执行此操作(或编写您自己的代码).但这意味着你必须没有自动生成的实体类.我个人认为这是不可接受的.

为什么不将前映像对象序列化为字典?或者将其属性值复制到自定义DTO类中?

从您的代码我可以告诉您希望旧值更改日志记录.你可以使用

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读