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