如何映射ICompositeUserType

wes*_*ton 4 c# nhibernate fluent-nhibernate

我正在将一个简单的工作演示从nhibernate移植到流畅.我现有的nhibernate映射是这样的:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MoneyHibernate"
                   namespace="MoneyHibernate">

  <class name="Invoice" table="Invoices">
    <id name="Id">
      <generator class="guid"/>
    </id>
    <property name="Number"/>
    <property name="Customer"/>
    <property name="TotalValue" type="MoneyHibernate.MoneyCompositeUserType,MoneyHibernate">
      <column name="TotalValue_Amount" not-null="true" />
      <column name="TotalValue_Currency" length="3" not-null="true" />
    </property>

  </class>

</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

我试图创建equlivilant ClassMap:

internal class InvoiceMap : ClassMap<Invoice>
{
    public InvoiceMap()
    {
        Id(x => x.Id);
        Map(x => x.Customer);
        Map(x => x.Number);
        Map(x => x.TotalValue)
            .CustomType(typeof (MoneyCompositeUserType))
            .Column("TotalValue_Amount")
            .Column("TotalValue_Currency");
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

---> NHibernate.MappingException:属性映射列数错误:MoneyHibernate.Invoice.TotalValue类型:MoneyHibernate.MoneyCompositeUserType

所以我认为两次声明列不是正确的方法吗?

CSL*_*CSL 6

您正在以正确的方式执行此操作,但是,您需要Columns.Clear()在手动声明列之前添加到映射中,如下所示:

Map(x => x.TotalValue)
        .CustomType(typeof (MoneyCompositeUserType))
        .Columns.Clear()
        .Columns.Add("TotalValue_Amount", "TotalValue_Amount");
Run Code Online (Sandbox Code Playgroud)

否则,除了用于复合用户类型映射的列集合之外,nHibernate还将追加新列名称(因此错误的列数异常).