Проблема автоматического сопоставления NHibernate - PullRequest
2 голосов
/ 06 мая 2011

Недавно я столкнулся со странным поведением в 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>

, что приводит к неправильным запросам:

  1. При вставке в UserGroupMember - Group_Id используется(что верно), не используя Parent_Id
  2. При выборе в UserGroupMember - используется Parent_Id

Group_Id - это столбец в файле отображения UserGroupMember, который отражает свойство Group в UserGroupMember.

Я попытался изменить отображение, добавив .KeyColumn ("Group_Id"), и это решает проблему.Но есть ли способ заставить Fluent NHibernate «мыслить правильно»?

1 Ответ

0 голосов
/ 06 мая 2011

Это из памяти, поскольку у меня нет готового тестового кода.

При использовании двунаправленного «многие ко многим» иногда приходится помогать 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; }
}

Как правило, если автоматическое преобразование (с соглашениями или без них) не 't генерировать правильные имена столбцов, особенно для нетривиальных случаев, не стесняйтесь ставить переопределение для установки этих имен столбцов вручную.

...