【问题标题】:How do I map an ICompositeUserType如何映射 ICompositeUserType
【发布时间】:2016-03-11 05:20:49
【问题描述】:

我正在将一个简单的工作演示从 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>

我已经尝试创建 equilivilant 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

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

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate


    【解决方案1】:

    您这样做是正确的,但是,您需要在手动声明列之前将Columns.Clear() 添加到您的映射中:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      相关资源
      最近更新 更多