【问题标题】:Entity Framework: How can I enable a one table per class inheritance with a rowversion field?实体框架:如何使用 rowversion 字段启用每个类继承一个表?
【发布时间】:2009-03-11 18:28:37
【问题描述】:

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

编辑:我想这样做的合乎逻辑的方法是只重命名对该字段的引用,即Student类中的PersonRowversion,该类从Person下降。

我是否缺少可以自动跟踪这些类型字段的 EF?

【问题讨论】:

    标签: entity-framework inheritance single-table-inheritance


    【解决方案1】:

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

    就“修改日期”等而言,一般只需要一个。如果你有一个超类Animal和一个子类Dog,实体框架会考虑更新“动物部分”或类型的“狗部分”作为整个实例的更新,就像 C# 一样。

    请记住,概念模型和存储模型是不同的东西,并且按照不同的规则发挥作用。在您的实体模型中工作时,请谨慎考虑严格的 OO 或严格的关系术语。在实体模型中,您正在桥接两个世界。 As I wrote elsewhere:

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

    【讨论】:

    • 即使使用该(祖先)类型的反射来获取属性值?我想这是我从未真正尝试过验证自己的假设。
    • 老实说,我从来没有使用过“new”(在属性隐藏的意义上)介绍代码,所以我不知道反射在这里做了什么。
    • @Craig 我认为 EF 在幕后使用了大量反射来实现它,因此如果它“新”了它,它可能只是“自动”发生。但是假设在编程中永远不会是好的......
    • “介绍”->“生产中”
    • @Craig,请加粗部分在“修改日期”等方面,您通常只需要一个....实体框架考虑更新“动物部分”或类型的“狗部分”是对整个实例的更新,就像 C# 一样”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多