在我的 asp 应用程序中,我想使用 Ruby on Rails 实体框架中的活动记录中的多态关联之类的东西。我知道 StackOverflow 上已经有一些主题在讨论这个问题,但我想在不使用继承的情况下实现它,因为它可以在 ruby on rails 中实现,所以我想问一下是否可能。
谢谢你。
在我的 asp 应用程序中,我想使用 Ruby on Rails 实体框架中的活动记录中的多态关联之类的东西。我知道 StackOverflow 上已经有一些主题在讨论这个问题,但我想在不使用继承的情况下实现它,因为它可以在 ruby on rails 中实现,所以我想问一下是否可能。
谢谢你。
我有很多使用实体框架进行适当的多态关联(即由接口定义的关联,而不是由抽象类型定义的关联)的经验。我认为这种模式对于良好的对象建模至关重要,并且我多次指责 EF 开发团队缺乏对这种可以轻松添加的模式的本地支持,IMO。(本机支持包括在 LINQ to Entites 中查询这些关联的能力,就像在 LINQ To Objects 中一样)。
在我的实现中,你必须持有一个“复合键”,它定义了关联对象的类型和身份——我相信,这就是它在 Hibernate 和 RoR 中的完成方式。导航关系是在代码中完成的,通过读取这个键,然后动态创建一个访问相应类型实例的方法。
尽管您不能将此复合键设置为 FK,但您可以使用“两半表模式”更加努力地添加参照完整性。我已经在 Naked Objects Development 手册中详细地写了这个,你可以在 Git Hub 上查找。但是,这些模式不依赖于 Naked Objects Framework,您可以复制它们。所有的源代码都在那里(参见 NakedObjects.Helpers 中的类 PolymorphicNavigator)。
Ruby on Rails 通过定义类型和键列来实现这种模式。正如您引用的链接中所说:
为了使这个工作,您需要在声明多态接口的模型中声明一个外键列和一个类型列
在规范的关系数据库中,这永远不能作为外键约束来实现,因为一个外键字段只能引用一个主键字段。因此,RoR 中的多态关联可能仅作为“软”外键实现。
这就是为什么这不能在 EF 中完全像在 RoR 中那样完成的原因。与外键一样,关联只能引用另一个实体。但是,您可以创建继承的类,每个类都可以引用自己的实体。这就是为什么只有在使用 EF 实现这些关联时才能找到继承示例的原因。另一个例子是我的问题。
继@richard-pawson 的回答之后,我已将“两半表”模式从实体框架移植到 Java(JDO/DataNucleus),并在github上有一个完整的示例。
您应该能够使用它在 .NET 领域提出类似的东西。