4

我正在将一个简单的工作演示从 nhibernate 移植到 fluent。我现有的休眠映射是这样的:

<?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>

我试图创建 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");
    }
}

但我得到了错误:

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

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

4

1 回答 1

6

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

Map(x => x.TotalValue)
        .CustomType(typeof (MoneyCompositeUserType))
        .Columns.Clear()
        .Columns.Add("TotalValue_Amount", "TotalValue_Amount");

否则,nHibernate 将在您的复合用户类型映射的列集合之外附加新的列名(因此列数错误异常)。

于 2013-06-05T08:44:52.303 回答