【问题标题】:NHibernate: Table Per Subclass Mapping and the New KeywordNHibernate:每个子类映射表和新关键字
【发布时间】:2010-01-29 02:02:46
【问题描述】:

我正在尝试使用 NHibernate 为每个子类继承结构映射一个表,如下所示:

public class BaseClass
{
    public virtual IColllection<BaseClassCollection> Collection { get; set; }
}

public class ChildClass : BaseClass
{
    public new virtual ICollection<ChildClassCollection> Collection { get; set; }
}

当我尝试从会话中获取 ChildClass 时出现以下错误:

“无法投射 'NHibernate.Collection.Generic.PersistentGenericBag1[BaseClassCollection]' to type 'System.Collections.Generic.ICollection1[ChildClassCollection]' 类型的对象。”

这是我的映射文件:

<class name="BaseClass" table="BaseClassTable">
  <bag name="Collection">
    <key>
      <column name="BaseClassCollectionId" />
    </key>
    <one-to-many class="BaseClassCollection" />
  </bag>
  <joined-subclass name="ChildClass" table="ChildClassTable">
    <key>
      <column name="BaseClassId" />
    </key>
    <bag name="Collection">
      <key>
        <column name="ChildClassCollectionId" />
      </key>
      <one-to-many class="ChildClassCollection" />
  </bag>
</class>

当我映射子类时,我需要某种方式来覆盖基类中 Collection 属性的类型。 NHibernate 可以做到这一点吗?

【问题讨论】:

    标签: c# nhibernate inheritance


    【解决方案1】:

    我认为唯一能让它发挥作用的方法是按照以下方式做一些事情:

    public class BaseClass<TChild> where TChild : BaseClassCollection {
        public virtual ICollection<TChild> Collection { get; set; }
    }
    
    public class ChildClass<TChild> : BaseClass<TChild> where TChild : ChildClassCollection {
        public override ICollection<TChild> Collection { get; set; }
    }
    
    public class BaseClassCollection { }
    public class ChildClassCollection : BaseClassCollection { }
    

    问题是new 关键字破坏了继承,然后您的映射依赖于该继承。你真的应该避免在任何地方使用new,因为这不是一个好主意;将 NHibernate 排除在外,您将获得不同的行为,具体取决于您如何投射您的课程;将其转换为BaseClass,您将获得与将其转换为ChildClass 完全不同的东西。

    如果这不是您要寻找的答案,我深表歉意,但如果您需要使用 new 关键字,我认为它无法正常工作。

    【讨论】:

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