【发布时间】:2023-03-08 19:33:05
【问题描述】:
有没有办法强制 LINQ-to-SQL 将列视为脏列?全球范围内就足够了....
基本上,我在与 L2S 交谈的遗留系统上的一些审计代码有问题,想象一下:
var ctx = new SomeDataContext(); // disposed etc - keeping it simple for illustration
var cust = ctx.Customers.First(); // just for illustration
cust.SomeRandomProperty = 17; // whatever
cust.LastUpdated = DateTime.UtcNowl;
cust.UpdatedBy = currentUser;
ctx.SubmitChanges(); // uses auto-generated TSQL
这很好,但如果同一个用户连续两次更新它,UpdatedBy 是 NOP,TSQL 将(大致):
UPDATE [dbo].[Customers]
SET SomeRandomColumn = @p0 , LastUpdated = @p1 -- note no UpdatedBy
WHERE Id = @p2 AND Version = @p3
在我的情况下,问题是当前所有表上都有一个大括号审计触发器,它检查审计列是否已更新,如果没有,则假定开发人员有错(替换为 @ 987654325@,尽管它可能同样容易引发错误)。
我真正想做的是说“总是更新这个专栏,即使它不脏”——这可能吗?
【问题讨论】:
-
不太确定我是否理解这个问题(可能不是)。你不能使用:partial void OnLoaded() { this.UpdatedBy = currentUser; } 所以它总是设置 UpdatedBy?
-
如果 UpdatedBy 不被视为真正的更改(因为它与上次的值相同),则不会发生该列的
UPDATE。 -
嗯,你不能通过手动附加实体来做到这一点吗?以前从未这样做过,但我相信它默认会更新所有列。见blogs.rev-net.com/ddewinter/2009/04/07/…尤其是第二章。
-
实体已附加,因为它是由 数据上下文提供给我们的。
-
哇,马克,这确实是一个艰难的过程!看看我能不能一起破解一些东西:)
标签: c# .net linq-to-sql