断开连接的 LINQ 更新:行版本与带触发器的日期时间

本文关键字:触发器 日期 时间 版本 连接 LINQ 更新 断开 | 更新日期: 2023-09-27 17:55:23

我们将 LINQ

to SQL 和 WCF 用于新的中间层,并且我们使用数据传输对象进行传递,而不是使用实际的 LINQ 类。 我将使用此处概述的一种或另一种方法 - 基于时间戳或行版本的 Linq Table Attach() - 以确保更新正常工作并正确处理并发性。

为了节省一些阅读时间,基本上您可以在表中使用时间戳/行版本列,或者使用具有默认值和更新触发器的日期时间列 - 无论哪种方式,它都会获得一个每次插入或更新时都会获得新生成的值的列,并且该列是 LINQ 用来检查并发性的列。

我的问题是 - 哪个更好? 我们已经在许多表中为"UpdateWhen"提供了日期时间列(但不是全部 - 不要问),但会添加默认值和触发器,或者我们可以添加行版本(我们现在必须使用时间戳语法,因为我们仍然支持SQL2005一段时间)到每个表 - 无论哪种方式,我们都在修改数据库以使其工作, 所以我想知道这两种选择之间是否存在性能差异或任何其他需要注意的重要差异。 我尝试过在网络上搜索SO,但到目前为止还没有运气。 谢谢。

断开连接的 LINQ 更新:行版本与带触发器的日期时间

我最近不得不做出类似的决定。

我首先尝试了行版本解决方案。
我发现的缺点:

  • 在 LINQ to-SQL 中不方便的用法,我将字段映射到 byte[]。比较字节数组时代码看起来不干净
  • 理论上rowversion可以翻转并再次从 0 开始,因此rowversion较高的行不一定是较旧的行
  • Rowversion 在任何行更新时都会更新,这在我的情况下是不可取的,我需要排除一些列以不影响行版本。拥有触发器可以实现任何级别的灵活性。

因此,我使用带有默认约束和更新触发器的 datetime2 列将值设置为 sysutcdatetime()。
此类型的精度为 100 纳秒(精度 7 位 - 23:59:59.9999999
)。虽然有可能,但我从未见过两次相同值的生成。但就我而言,如果有重复项,也不会有什么坏处。如果它对我很重要,我会添加独特的约束,看看这是否会失败。

我使用了 sysutcdatetime(),因为这个值不会受到夏令时的影响。

我倾向于使用时间戳列进行并发检查。一 - 触发器会对性能产生一些影响,二 - 对于日期时间列,您将限制自己在 SQL 和 C# 中 DateTime 列的精度。

MSDN:

日期时间值四舍五入为 .000、.003 或 .007 秒的增量...

您可能需要查看 SO:c# 中的 DateTime 和 SQL Server 中的 DateTime 之间有什么区别吗?和 MSDN:datetime (Transact-SQL) 以获取更多信息。