0

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

人员:FirstName、LastName、Age、VersionNumber
医生:所有人员属性 + 职业
运动员:所有人员属性 + 运动、YearsPro
音乐家:所有人员属性 + 乐器

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

在这种特殊情况下,我想拯救运动员。现在,只有 Person 基类有 VersionNumber。我只是不确定如何保存它。

注意:因为 Person 在 C# 域实体中已经有一个 VersionNumber 属性,所以我不能将相同的属性名称添加到具体类中。

4

1 回答 1

1

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

如果这不是一个选项,则必须在每个表的基础上完成乐观锁定。为每个表添加一个 VersionNumber 列,linq-to-sql 将使用它。你现在拥有的方式也有效。Linq-to-sql 将使用Person表的 VersionNumber 并回退到在更新其他表时断言每个属性都没有改变。如果数据库中的任何属性在它们为红色后发生了更改,则 linq-to-sql 将导致更新失败并出现并发错误。

于 2012-05-26T18:26:31.607 回答