2011-05-06 168 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