gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:52:40 25 4
gpt4 key购买 nike

对于我的 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 将导致对 old 的 SQL 插入除了 real 的任何 SQL 更新。删除它(但保留 old.Bar)使事情按我预期的那样工作。

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

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

最佳答案

您的分析是正确的。您的任务是建立链接。

您可以修改生成的代码以不执行此操作(或编写您自己的代码)。但这意味着您必须在没有自动生成的实体类的情况下生活。我个人认为这是 Not Acceptable 。

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

从您的代码中我可以看出您希望旧值执行更改日志记录。您可以使用

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

关于c# - 避免在 LINQ 中保存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4125517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com