NHibernate自动映射问题
最近我在自动映射Fluent 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
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。