跨越两个表的 Linq 到 SQL 时间戳

本文关键字:Linq SQL 时间戳 两个 跨越 | 更新日期: 2023-09-27 18:35:21

我正在使用 SQL Server 时间戳列(称为 VersionNumber)来支持 Linq-to-SQL 的乐观并发。当只涉及一个表时,这很有效。但是,我有如下所示的域实体:

人员:名字、姓氏、年龄、版本号
医生:所有 个人属性 + 职业
运动员:所有 人物属性 + 运动,岁月
音乐家:所有 人物属性 + 乐器

我的数据库有一个"人员"表

,然后是每种类型的"人员"的其他表。具体表(如运动员)只有运动员所需的列。具体表与 Person 表具有 1-1 映射。在这种情况下如何使用版本号?具体表可以/应该有自己的版本号列吗?是否应该只有"人员"表具有"版本号"列?在这种情况下,我应该如何保存数据?

在这种特殊情况下,我想拯救运动员。目前,只有 Person 基类具有版本号。我只是不确定如何保存它。

注意:由于 Person 已在 C# 域实体中具有 VersionNumber 属性,因此我无法将同一属性名称添加到具体类中。

跨越两个表的 Linq 到 SQL 时间戳

linq-to-sql 支持单表继承,因此,如果您可以自由地重新设计数据库,则应创建一个包含所有字段的表。然后添加一个type字段,该字段将告诉 linq-to-sql 为每个特定行具体化哪种具体类型。

如果这不是一个选项,则必须基于每个表执行乐观锁定。向每个表添加一个版本号列,linq-to-sql 将使用它。你现在拥有它的方式也有效。Linq-to-sql 将使用Person表的版本号,并在更新其他表时回退到断言每个属性保持不变。如果数据库中的任何属性自显示为红色以来已更改,则 linq-to-sql 将使更新失败并发错误。