【发布时间】: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>
导致错误查询:
- 在 UserGroupMember 中插入时 - 使用 Group_Id(这是正确的),而不是使用 Parent_Id
- 在 UserGroupMember 中选择时 - 使用 Parent_Id
Group_Id 是 UserGroupMember 映射文件中的列,反映了 UserGroupMember 中的 Group 属性。
我尝试修改添加 .KeyColumn("Group_Id") 的映射,它解决了问题。但是有什么方法可以让 Fluent NHibernate '思考正确的方式'?
【问题讨论】:
标签: nhibernate fluent-nhibernate automapping