1

为什么我不能在子类中定义同名的成员?每个类继承一个表rowversion timestamp,每个表中都有一个字段。似乎实体设计者应该允许这样做并使用new属性上的关键字来实现它。解决方法是什么?如果我不能使用,如何在具有不同值的继承链中指定相同的字段new?对于具有 rowguid、modifiedbys、modifieddates 等的其他数据库,这可能是正确的。

编辑:我想这样做的合乎逻辑的方法是重命名对该字段的引用,即PersonRowversionStudentPerson.

我是否错过了一块可以自动跟踪这些字段的 EF?

4

1 回答 1

5

因为一个类不能有两个同名的成员。“新”不会做你想做的事。"new" 隐藏继承的成员;它不会给你两个同名的不同成员。因此,如果生成的代码使用“新”,那么您将永远无法从 C# 代码访问“父表”中的值。两个数据库表有两个同名的列是可以的,但是当两个表组成一个类时,您需要在概念模型中重命名重复的列名。

在“修改日期”等方面,您通常只需要一个。如果您有 Animal 的超类型和 Dog 的子类型,那么实体框架会将对该类型的“动物部分”或“狗部分”的更新视为对整个实例的更新,就像 C# 一样。

请记住,概念模型和存储模型是不同的东西,并且遵循不同的规则。在您的实体模型中工作时,请谨慎考虑严格的 OO 或严格的关系术语。在实体模型内部,您正在桥接两个世界。正如我在别处所写

在设计一个好的对象关系映射时,你必须克服的心理障碍之一是倾向于主要以面向对象的术语或关系术语来思考,这取决于你的个性。然而,一个好的对象关系映射同时包含一个好的对象模型和一个好的关系模型。例如,假设您有一个数据库,其中包含一个人员表,以及员工和客户的相关表。一个人可能在所有三个表中都有记录。现在,从严格关系的角度来看,您可以为员工构建一个数据库 VIEW,为客户构建另一个数据库,这两个数据库都包含来自 People 表的信息。使用一个视图或另一个视图时,您可以暂时将个人视为“只是”一个员工或“只是”一个客户,即使你知道他们都是。因此,来自这种世界观的人可能会尝试进行 OO 映射,其中 Employee 和 Customer 都是 Person 的(直接)子类。但这不适用于我们拥有的数据;由于一个人同时拥有员工和客户记录(并且由于没有任何 Person 实例可以同时属于具体子类型 Employee 和 Customer),Person 和 Employee 之间的 OO 关系需要是组合而不是继承,对于 Person 和 Customer 也是如此。

于 2009-03-11T18:37:51.473 回答