gpt4 book ai didi

c# - 断开连接的 LINQ 使用触发器更新 : rowversion vs. 日期时间?

转载 作者:行者123 更新时间:2023-11-30 14:17:27 29 4
gpt4 key购买 nike

我们正在使用 LINQ to SQL 和 WCF 作为新的中间层,并且我们正在使用数据传输对象通过网络进行传输,而不是使用实际的 LINQ 类。我将使用此处概述的一种或另一种方法 - Linq Table Attach() based on timestamp or row version - 为了确保更新正常工作并正确处理并发。

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

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

最佳答案

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

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

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

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

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

关于c# - 断开连接的 LINQ 使用触发器更新 : rowversion vs. 日期时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5912984/

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