NHibernate自动映射问题

NHibernate自动映射问题,nhibernate,fluent-nhibernate,automapping,Nhibernate,Fluent Nhibernate,Automapping,最近我在自动映射Fluent NHibernate时遇到了一个奇怪的行为。我有下面的类结构,为了简洁起见,一些属性被截断了 public class UserGroup { public virtual UserGroup ParentGroup { get; set; } public virtual UserGroupMember Manager { get; protected set; } public virtual ISet<UserGroupMem

最近我在自动映射Fluent 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 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>
这会导致错误的查询:

当在UserGroupMember中插入时,使用正确的组\u Id,而不使用父\u Id 当在UserGroupMember中选择时,使用父\u Id Group_Id是UserGroupMember映射文件中的列,反映UserGroupMember中的组属性


我试图修改映射添加.KeyColumnGroup_Id,它解决了这个问题。但是有没有办法让Fluent NHibernate“以正确的方式思考”?

这是来自内存,因为我还没有准备好测试代码

当使用双向多对多时,如果列名称两侧不相同,有时必须帮助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; }
}

根据经验,如果使用或不使用约定的自动映射不能生成正确的列名,特别是对于非平凡的情况,请毫不犹豫地使用覆盖来手动设置这些列名。

这是内存中的,因为我没有准备好测试代码

当使用双向多对多时,如果列名称两侧不相同,有时必须帮助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; }
}

根据经验,如果使用或不使用约定的自动映射无法生成正确的列名,尤其是对于非平凡的情况,请毫不犹豫地使用覆盖来手动设置这些列名。

我认为情况并非如此。这是一对多的关系。我认为问题可能在于我有两个属性,一个是UserGroupMember,另一个是ISet。我认为情况并非如此。这是一对多的关系。我认为问题可能在于我有两个属性,一个是UserGroupMember,另一个是ISet。