NHibernate 在单独的程序集中加入了子类

Posted

技术标签:

【中文标题】NHibernate 在单独的程序集中加入了子类【英文标题】:NHibernate Joined Subclass in Separate Assemblies 【发布时间】:2008-11-03 20:47:04 【问题描述】:

我有以下解决方案项目结构:

Application.Core.Entities

Application.Xtend.CustomerName.Entities

在核心项目中,我有一个实体客户。在 XTend 项目中,我定义了一个名为 xCustomer 的 Customer 的子类实体(因为目前没有更好的名称......)。

这里的想法是我们的​​应用程序中有一个核心域模型。然后,客户可以创建一个新组件,其中包含对我们核心模型的扩展。当扩展程序集存在时,智能IRepository 类将返回核心类的子类。

我试图在NHibernate 中映射这种关系。使用Fluent NHibernate 我能够生成这个映射:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   default-lazy="false"
                   assembly="NHibernate.Core.Entites"
                   namespace="NHibernate.Entites"
                   default-access="field.camelcase-underscore">
  <!-- Customer is located in assembly Application.Core.Entities -->
  <class name="Customer" table="Customers" xmlns="urn:nhibernate-mapping-2.2">
    <id name="Id" column="Id" type="Int64">
      <generator class="native" />
    </id>
    <component name="Name" insert="true" update="true">
      <property name="LastName" column="LastName" length="255" type="String" not-null="true">
        <column name="LastName" />
      </property>
      <property name="FirstName" column="FirstName" length="255" type="String" not-null="true">
        <column name="FirstName" />
      </property>
    </component>
    <!-- xCustomer is located in assembly Application.XTend.CustomerName.Entities -->
    <joined-subclass name="xCustomer" table="xCustomer">
      <key column="CustomerId" />
      <property name="CustomerType" column="CustomerType" length="255" type="String" not-null="true">
        <column name="CustomerType" />
      </property>
    </joined-subclass>
  </class>
</hibernate-mapping>

但是 NHib 抛出以下错误:

NHibernate.MappingException: 持久类 Application.Entites.xCustomer, 未找到 Application.Core.Entites ---> System.TypeLoadException:无法加载类型 'Application.Entites.xCustomer' 来自 程序集'Application.Core.Entites, 版本=1.0.0.0,文化=中性, PublicKeyToken=null'..

这很有意义 xCustomer 没有在核心库中定义。

是否可以像这样跨越不同的程序集?我处理问题的方法有误吗?

【问题讨论】:

【参考方案1】:

我在 NHibernate 用户邮件列表上提出了同样的问题,并且解决方案非常明显,以至于我有点尴尬以至于我看不到它。

hibernate-mapping 属性程序集和命名空间是方便的捷径,让您不必完全限定您的类名。这使您可以很好地标记,但类和连接子类元素的名称属性也可以采用完全限定的程序集名称。

所以上面损坏的映射文件可以这样修复:

<joined-subclass name="Application.XTend.CustomerName.Entities.xCustomer, 
                 Application.XTend.CustomerName.Entities, Version=1.0.0.0, 
                 Culture=neutral, PublicKeyToken=null" 
                 table="xCustomer">
  <key column="CustomerId" />
  <property name="CustomerType" column="CustomerType" length="255" 
            type="String" not-null="true">
    <column name="CustomerType" />
  </property>
</joined-subclass>

这符合我的预期。因此,我查看了 Fluent-NHibernate 源代码并创建了一个完整的补丁,其中包含工作单元测试来解决问题和submitted it to the project。

感谢您的帮助@David Kemp

【讨论】:

【参考方案2】:

您需要使用&lt;class&gt; 元素的extends 属性进行映射(AFAIK,这是 NHibernate 2.0 中的新功能)。然后,您可以在 XTend 程序集中拥有您的子类映射 (.hbm.xml)。

您可能必须使用 AddAttribute/AddProperty(不记得它叫什么)才能使用 Fluent NHibernate 执行此操作。 (或提交补丁)。

【讨论】:

以上是关于NHibernate 在单独的程序集中加入了子类的主要内容,如果未能解决你的问题,请参考以下文章

您可以从位于单个结果集中的两个单独的表中提取数据吗? [不加入问题]

流畅的 nHibernate 数据库连接

NHibernate 命名查询,每个子类都有表

如何使用 NHibernate 联合子类映射抽象属性?

通过子类结构在 nHibernate 表上使用 Linq 按类型查询

如何使用 Fluent NHibernate 自动映射禁用特定抽象基类的子类化