在使用 Linq To SQL 时,如果其他列没有更改,如何避免设置某些列?

Posted

技术标签:

【中文标题】在使用 Linq To SQL 时,如果其他列没有更改,如何避免设置某些列?【英文标题】:How can I avoid setting some columns if others haven't changed, when working with Linq To SQL? 【发布时间】:2010-05-20 18:10:31 【问题描述】:

在 LINQ to SQL 中,如果其他列没有更改,我想避免设置某些列吗?说我有

dim row = (From c in dataContext.Customers Where c.Id = 1234 Select c).Single()
row.Name = "Example"
' line 3
dataContext.SubmitChanges()   ' line 4

太好了,所以 LINQ to SQL 会获取一行,在内存中将名称设置为“Example”,然后仅在必要时生成更新 SQL 查询——也就是说,如果出现以下情况,则不会生成 SQL客户的名字已经是“示例”。

假设在第 3 行,我想检测行是否已更改,如果是,则设置 row.UpdateDate = DateTime.Now。如果行没有改变,我不想设置 row.UpdateDate 以便不生成 SQL。有什么好办法吗?

【问题讨论】:

这是 OR 抽象的丑陋一面。有没有办法避免不得不关心这个?也就是说,以某种方式设置 OR 映射以在另一列发生更改时自动更新 row.UpdateDate? 【参考方案1】:

你可以实现这样的东西,因为我不确定是否有默认的方法来完成这个,因为你正在设置属性。

Dim row = (From c in dataContext.Customers Where c.id = 1234 Select c).Single
if (row.Name <> "Example") Then
    row.Name = "Example"
    row.UpdateDate = DateTime.Now
End If
datacontext.SubmitChanges()

编辑

在 datacontext 类中有一个 PropertyChanged 事件,您可以挂钩。

所以你可以做类似的事情

AddHandler row.PropertyChanged, AddressOf UpdateRowDate

【讨论】:

这就是我害怕的。您可以想象如果要设置十列,那么我必须在条件中管理十个谓词。我希望有一种方法只是说 [ If row.HasChanged() Then row.UpdateDate = DateTime.Now ] 如果我知道如何检测内存中的行是否发生变化,我可以编写自己的方法。 可以使用PropertyChanged,但是也比较麻烦。【参考方案2】:

我无法想到实际的代码,但由于 Linq-to-SQL 实体是部分类,只需将一些逻辑扩展到它们中以检查这一点。每个属性在更改时都有事件,因此在您的部分类中绑定到属性更改事件并让它在对象上设置 UpdateDate。

【讨论】:

以上是关于在使用 Linq To SQL 时,如果其他列没有更改,如何避免设置某些列?的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 保存到 SQL 中的 DATE 类型列 - Linq to SQL

带有 XML 数据库字段的 Linq-to-SQL —— 为啥会这样?

在运行时将实体对象添加到 LINQ-to-SQL 数据上下文 - SQL、C#(WPF)

如何使用 LINQ to SQL 在计算列上获得不同的值?

是否可以在选择完成之前设置列别名,使用 Linq to SQL

linq to sql startwith 性能索引列