2011-05-06 166 views
2

最近我遇到了一個奇怪的行爲在自動映射的流利NHibernate。我有以下的階級結構(爲了釀造起見,一些屬性被切斷了)。NHibernate自動映射問題

public class UserGroup 
{ 
    public virtual UserGroup ParentGroup { get; set; } 

    public virtual UserGroupMember Manager { get; protected set; } 

    public virtual ISet<UserGroupMember> Members { get; protected set; } 
} 

public class UserGroupMember : BaseEntity 
{ 
    public virtual User User { get; set; } 

    public virtual UserGroup Group { get; set; } 
} 

用於用戶組的映射:

public class UserGroupMap : IAutoMappingOverride<UserGroup> 
{ 
    public void Override(AutoMapping<UserGroup> mapping) 
    { 
     mapping.HasMany(el => el.Members) 
      .Cascade 
      .AllDeleteOrphan().Inverse().LazyLoad(); 
    } 
} 

的自動映射在UserGroupMember表創建兩個柱(兩者均爲外鍵),以反映用戶組之間的關係和UserGroupMembers。我發現,所產生的映射包含錯誤的列(如下圖所示):

<set cascade="all-delete-orphan" inverse="true" lazy="true" name="Members" mutable="true"> 
    <key> 
     <column name="Parent_Id" /> 
    </key> 
    <one-to-many class="Groups.Data.UserGroupMember, Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
</set> 

導致錯誤的查詢:

  1. 雖然UserGroupMember插入 - 用於分組ID(這是正確的) ,雖然在UserGroupMember選擇不使用PARENT_ID
  2. - 用於PARENT_ID

分組ID是在UserGroupMember映射文件反映了組PROPERT列y在UserGroupMember中。

我試圖修改添加.KeyColumn(「Group_Id」)的映射,它解決了問題。但是有沒有什麼辦法可以讓流利的NHibernate「以正確的方式思考」?

回答

0

這是來自內存,因爲我沒有準備好測試代碼。

當使用雙向多對多時,如果雙方不是「相似」,則有時必須幫助FHN圖列名稱。

例如,這應該映射正確地將

public class User 
{ 
    public IList<Group> Groups { get; set; } 
} 

public class Group  
{ 
    public IList<User> Users { get; set; } 
} 

雖然不會

public class User 
{ 
    public IList<Group> BelongsTo { get; set; } 
} 

public class Group  
{ 
    public IList<User> Contains { get; set; } 
} 

作爲一個經驗法則,如果自動映射(有或沒有約定)不會產生正確的列名,特別是對於非平凡的情況,請毫不猶豫地重寫以手動設置這些列名稱。

+0

我不認爲是這樣。這是一對多的關係。我認爲問題可能是我有兩個屬性,一個是UserGroupMember,另一個是ISet 。 – 2011-05-06 10:49:57