【问题标题】:NHibernate Automapping problemNHibernate 自动映射问题
【发布时间】:2011-08-19 22:09:30
【问题描述】:

最近我在 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; }
}

用户组的映射:

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

自动映射会在 UserGroupMember 表中创建两列(均为外键),以反映 UserGroup 和 UserGroupMember 之间的关系。我发现生成的映射包含错误的列(如下所示):

<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

Group_Id 是 UserGroupMember 映射文件中的列,反映了 UserGroupMember 中的 Group 属性。

我尝试修改添加 .KeyColumn("Group_Id") 的映射,它解决了问题。但是有什么方法可以让 Fluent NHibernate '思考正确的方式'?

【问题讨论】:

    标签: nhibernate fluent-nhibernate automapping


    【解决方案1】:

    这是凭记忆的,因为我没有准备好测试代码。

    当使用双向多对多时,有时您必须帮助 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.
    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多