2013-06-05 23 views
4

我移植一個簡單​​的工作演示從NHibernate的流暢來。我現有的NHibernate的映射是這樣的:如何映射的ICompositeUserType

<?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: property mapping has wrong number of columns: MoneyHibernate.Invoice.TotalValue type: MoneyHibernate.MoneyCompositeUserType

所以我推測,聲明欄兩次不是正確的方法來做到這一點?

回答

6

你這個做了正確的方式,但是,你需要前柱這樣的手冊聲明添加Columns.Clear()到您的映射:

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

否則NHibernate的將追加另外新列名添加到您的複合用戶類型映射的列集合(因此錯誤的列數異常)。