我有以下解决方案项目结构:
Application.Core.Entities
Application.Xtend.CustomerName.Entities
在Core项目中,我有一个实体 Customer defiend。在XTend项目中,我有一个实体,它定义了客户名为 xCustomer 的子类(此时缺少更好的名称......)。
这里的想法是我们的应用程序中有一个Core域模型。然后,客户可以创建一个包含核心模型扩展的新程序集。当扩展程序集出现时,智能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未找到 ---&GT; System.TypeLoadException:无法加载类型 'Application.Entites.xCustomer'来自 程序集'Application.Core.Entites, 版本= 1.0.0.0,文化=中立, 公钥=空” ..
哪个有意义xCustomer未在Core库中定义。
是否可以跨越这样的不同组件?我接近这个问题了吗?
答案 0 :(得分:7)
我在NHibernate Users邮件列表上问了同样的问题,解决方案非常明显,我有点尴尬,我看不到它。
hibernate-mapping属性程序集和命名空间是方便的快捷方式,允许您不必完全限定类名。这使得你可以得到很好的标记,但是类和连接子类元素的name属性也可以采用完全限定的程序集名称。
所以上面破坏的映射文件可以修改如下:
<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
答案 1 :(得分:3)
您需要使用extends
元素的<class>
属性进行映射(AFAIK,这是NHibernate 2.0中的新增功能)。然后,您可以在XTend程序集中进行子类映射(.hbm.xml
)。
您可能必须使用AddAttribute / AddProperty(不记得它的名称)来使用Fluent NHibernate来完成此操作。 (或提交补丁)。