【问题标题】:Mapping NHibernate many-to-one relationships from abstract base classes to union-subclasses将 NHibernate 多对一关系从抽象基类映射到联合子类
【发布时间】:2010-11-19 19:29:41
【问题描述】:

我在将多对一关系从抽象基类映射到具体联合子类时遇到问题。示例:

public abstract class Entity
{
    public virtual Guid ID {get; set;}
    public virtual string Name {get;set;}
    public virtual User OwnerUser {get; set;}
}

public class User : Entity
{
    public virtual string UserName {get; set;}
}

正如您在此处看到的,我的所有数据库对象都有一个基本抽象类。我将这些类与 Entity 类作为抽象映射类和 User 作为联合子类进行映射。创建配置对象时,不会引发任何错误,并且 Schema 导出也很好。但是, OwnerUser 的字段不会显示在所有具体类的数据库中。以下是映射外观的示例

<class entity-name="Entity" name="Entity" abstract="true">
    <id name="ID" type="guid">
       <generator class="guid.comb"/>
    </id>
    <property name="Name" />
    <many-to-one name="OwnerUser" column="ID" entity-name="User" />
</class>

<union-subclass name="User" entity-name="User" extends="Entity">
    <property name="UserName" />
</union-subclass>

我还使用 Oracle XE 实例作为数据库后端。如果这些信息不足以正确回答问题,请告诉我,我会尽我所能补充。

最坏的情况下,我将在所有具体对象上显式添加多对一关系,但这不是最优雅的解决方案,我认为我的建议应该可行。我无法在为各种互联网供电的管子上找到任何具体的例子,我也没有在文档中找到任何明确说明这是一个无效用例的内容,尽管我可能遗漏了一些东西。这不会是第一次:-/

非常感谢您对此问题的任何回答。感谢您的宝贵时间。

【问题讨论】:

    标签: c# asp.net nhibernate


    【解决方案1】:

    哇,只是……哇。

    我不会尝试删除此帖子,而是将其留给另一位低级休眠的菜鸟找一天,因为我找不到有关此特定用例的任何问题。

    事实上,您可以毫无问题地做到这一点。我的问题是我正在为多对一映射元素中的列属性指定 ID。出于某种奇怪的原因,我认为这是外键引用的列(如果我没记错的话,它实际上是属性引用)。该属性实际上指定了包含引用的表中的列名(d'oh!)。令人惊讶的是,NHibernate 会愉快地将多个映射元素映射到同一个列名,而不会发出警告。我并不是要责怪他们,也许这样做的用例是允许对多态派生类进行某种类型的覆盖。

    无论如何,这是一个有效的用例,将列属性更改为引用表中列的名称可以正常工作。也许我这周每晚都在看比特和字节太久了……sigh

    感谢所有花时间查看这篇文章的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多