Недавно я столкнулся со странным поведением в Automapping of 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 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>
, что приводит к неправильным запросам:
- При вставке в UserGroupMember - Group_Id используется(что верно), не используя Parent_Id
- При выборе в UserGroupMember - используется Parent_Id
Group_Id - это столбец в файле отображения UserGroupMember, который отражает свойство Group в UserGroupMember.
Я попытался изменить отображение, добавив .KeyColumn ("Group_Id"), и это решает проблему.Но есть ли способ заставить Fluent NHibernate «мыслить правильно»?