最近我在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>
会导致错误的查询:
Group_Id是UserGroupMember映射文件中的列,它反映了UserGroupMember中的Group属性。
我尝试修改添加.KeyColumn(“Group_Id”)的映射,它解决了问题。但有没有办法让Fluent NHibernate“以正确的方式思考”?
答案 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; }
}
根据经验,如果自动化(使用或不使用约定)不会生成正确的列名,特别是对于非平凡的情况,请不要犹豫,使用覆盖手动设置这些列名称。