NHibernate Automapping问题

时间:2011-05-06 05:54:44

标签: nhibernate fluent-nhibernate automapping

最近我在Fluent NHibernate的Automapping中遇到了一个奇怪的行为。我有以下类结构(为了酿造而切断了一些属性)。

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; }
}

UserGroup的映射:

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

自动化在UserGroupMember表中创建两列(两者都是外键),以反映UserGroup和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中的插入 - 使用Group_Id(这是正确的),而不是使用Parent_Id
  2. 在UserGroupMember中选择 - 使用Parent_Id
  3. Group_Id是UserGroupMember映射文件中的列,它反映了UserGroupMember中的Group属性。

    我尝试修改添加.KeyColumn(“Group_Id”)的映射,它解决了问题。但有没有办法让Fluent NHibernate“以正确的方式思考”?

1 个答案:

答案 0 :(得分: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; }
}

根据经验,如果自动化(使用或不使用约定)不会生成正确的列名,特别是对于非平凡的情况,请不要犹豫,使用覆盖手动设置这些列名称。