为什么我不能在子类中定义具有相同名称的成员?每个类继承一个表,每个表中有一个rowversion timestamp
字段。似乎实体设计者应该允许这样做,并使用属性上的new
关键字来实现它。解决方法是什么?如果我不能使用new
,如何在具有不同值的继承链中指定相同的字段?对于具有rowguids,modifiedbys,modifieddates等的其他数据库,情况可能如此。
编辑我想这样做的逻辑方法就是重命名对该字段的引用,即PersonRowversion
类中的Student
,它来自{Person
1}}。
我是否错过了一块可以自动跟踪这些字段的EF?
答案 0 :(得分:5)
因为一个类不能有两个具有相同名称的成员。 “新”不会做你想要的。 “新”隐藏了继承的成员;它没有给你两个具有相同名称的不同成员。因此,如果生成的代码使用“new”,那么您将永远无法从C#代码访问“父表”中的值。两个数据库表都可以有两个同名的列,但是当两个表组成一个类时,您需要在概念模型中重命名重复的列名。
就“修改日期”等而言,您通常只需要一个。如果您拥有超级类型的动物和狗的子类型,则实体框架会考虑更新“动物部分“或”狗部分“的类型是对整个实例的更新,就像C#一样。
请记住,概念模型和存储模型是不同的东西,并且遵循不同的规则。在您的实体模型中工作时,请务必严格考虑OO或严格的关系术语。在实体模型中,你正在弥合这两个世界。 As I wrote elsewhere:
在设计良好的对象关系映射时,您必须克服的一个心理障碍是倾向于主要以面向对象的术语或关系术语来思考,以适合您的个性。但是,良好的对象关系映射包含了良好的对象模型和良好的关系模型。例如,假设您有一个包含People表的数据库,以及Employees和Customers的相关表。一个人可能在所有三个表中都有记录。现在,从严格的关系角度来看,您可以为员工构建数据库VIEW,为客户构建另一个数据库VIEW,这两者都包含People表中的信息。当使用一个VIEW或另一个时,您可以暂时将个人视为“只是”员工或“只是”客户,即使您知道他们两者都是。所以来自这个世界观的人可能会想要进行OO映射,其中Employee和Customer都是Person的(直接)子类。但这不适用于我们拥有的数据;由于单个人同时拥有员工和客户记录(并且由于任何Person实例都不能同时具有子类型Employee和Customer),因此Person和Employee之间的OO关系需要是组合而不是继承,对于Person和Customer也是如此。