2009-08-04 94 views
3

故事: 我有class User和class Organization:User。我沒有使用這些類的映射,讓FNH自動映射。然後,我添加了流利的NHibernate:覆蓋不在基類中的派生類自動映射

public class OrganizationMap : IAutoMappingOverride<Organization> 
    { 
     public void Override(AutoMap<Organization> mapping) 
     { 
     } 
    } 

請注意,沒有重寫。所以我沒有想到FNH行爲有任何變化。但是我得到這個(過程模式實際出口):

NHibernate.MappingException: (XmlDocument)(2,4): XML validation error: The element 'class' in namespace 'urn:nhibernate-mapping-2.2' has incomplete content. List of possible elements expected: 'meta, subselect, cache, synchronize, comment, tuplizer, id, composite-id' in namespace 'urn:nhibernate-mapping-2.2'.

生成Orders.Core.Organization.hbm.xml真的空:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access=""> 
    <class name="Orders.Core.Organization, Orders.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Organizations" xmlns="urn:nhibernate-mapping-2.2" /> 
</hibernate-mapping> 

所以,我回顧了User.hbm我後想到這個主意 - 我需要重寫組織在基類中是這樣的:

public class UserMap : IAutoMappingOverride<User> 
    { 
     public void Override(AutoMap<User> mapping) 
     { 
     mapping.JoinedSubClass<Organization>("ColumnId", m => {...} 
     ); 
     } 
    } 

不過,我會更好地喜歡做這在組織一個單獨的映射覆蓋類...畢竟,會是什麼樣的映射成爲如果我在單個覆蓋方法中有5個子類。

這可能嗎?

回答

1

原來,最新的FNH(RC後的一些修訂版)現在可以實現。我不知道這是因爲我問;-)

所以我有這個

mapping.JoinedSubClass<Organization>("UserId", m => 
    { 
     m.HasMany(x => x.Currencies).Element("Currency").AsBag(); 
    } 
); 

,並停止升級到RC後工作。然後我把它移到它自己的類

public class OrganizationMap : IAutoMappingOverride<Organization> 
    { 
     public void Override(AutoMapping<Organization> mapping) 
     { 
     mapping.HasMany(x => x.Currencies).Element("Currency").AsBag(); 
     } 
    } 

它開始再次工作。就像我想要的一樣!無論如何,現在我甚至不需要指定JoinedSubClass,因爲這是默認的。我可以重寫我很酷的子類屬性。

雖然不容易弄清楚爲什麼NH開始抱怨字符串的關聯......我甚至認爲這個元素在RC中被破壞了。我想知道爲什麼JoinedSubClass仍然有這個映射部分,如果它不完全工作。

1

您的重寫正告訴FNH您將手動編寫該類的映射。你得到的錯誤是因爲組織沒有任何映射(如果你查看生成的HBM.xml,它將是空的)。

你到底想寫什麼覆蓋?

編輯:

在這種情況下,你可以做這樣的事情:

public class MyAlteration : IAutoMappingAlteration 
{ 
    public void Alter(AutoPersistenceModel model) 
    { 
     model.ForTypesThatDeriveFrom<User>(
      map => map.HasMany<User>(x => x.Children) 
     ); 
    }  
} 

和配置功能NHibernate時:

model.Alteration(a => a.Add<MyAlteration>()); 

注:這是採用最新流暢的nhibernate的代碼庫(1.0RC)。

+0

我想要重寫他們自己的映射類中的子類,也就是在OrganizationMap中聲明類似「IsSubclassOf ()」。 – queen3 2009-08-25 07:34:35