Самостоятельное сопоставление многих и многих взаимосвязей в автоматизированном автоматическом форматировании Fluent NHibernate до 1: n, а не n: n

Название в значительной степени объясняет все это, у меня есть объект Member, который ссылается на "Друзья", которые также являются членами типа.

public class Member : Entity
    {
        public Member()
        {            
            Friends = new List<Member>();
        }

        public virtual IList<Member> Friends
        {
            get; set;
        }
     }

Инструмент генерации схемы делает это отношением 1: n, в то время как это должно быть отношение n: n, то есть столбец добавляется в таблицу-член, именуемую member_id, и не создается соединительная таблица.

Есть ли способ сделать Self ссылкой на многие из многих отношений в Fluent NHibernate?

Я попытался использовать переопределение, которое я получил как ответ раньше:

public class MemberOverride : IAutoMappingOverride<Member>
{
    public void Override(AutoMapping<Member> mapping)
    {
        mapping.HasManyToMany(m => m.Friends)
               .Table("MemberFriendsLinkTable");
    }
}

но я получаю сообщение об ошибке:

"NHibernate.MappingException: повторный столбец в сопоставлении для коллекции: столбец Proj.BO.Member.Friends: Member_id"

Спасибо

EDIT: Я нашел ответ, чтобы поставить:

mapping.HasManyToMany(m => m.Friends).ParentKeyColumn("Member_Id").ChildKeyColumn("Friend_Id")
                   .Table("MemberFriendsLinkTable").Inverse().Cascade.SaveUpdate();

Ответ 1

Итак, мне больше не нужно видеть этот вопрос в верхней части списка "Вопросы без ответа NHibernate"...

Эйтан, искатель, обнаружил решение своей проблемы. Ему нужно было указать ParentKeyColumn и ChildKeyColumn следующим образом:

РЕДАКТИРОВАТЬ: Я нашел ответ, чтобы поставить:

mapping.HasManyToMany(m => m.Friends)
    .ParentKeyColumn("Member_Id")
    .ChildKeyColumn("Friend_Id")
    .Table("MemberFriendsLinkTable")
    .Inverse()
    .Cascade.SaveUpdate();

FluentNHibernate по умолчанию именует столбцы внешнего ключа следующим образом: {className}_Id. Поскольку оба конца множества ко многим относятся к одному типу, он хотел использовать одно и то же имя столбца, Member_Id для обоих столбцов. Явное назначение столбцов обходит эту проблему.

Ответ 2

References(x => x.Parent)
            .Class<Parent>()
            .Access.Property()
            .Cascade.None()
            .LazyLoad()
            .Not.Insert()
            .Not.Update()
            .Columns("PARENT_ID");

        HasMany(x => x.Children)
          .Access.Property()
          .AsBag()
          .Cascade.SaveUpdate()
          .LazyLoad()
          .Inverse()
          .Generic()
          .KeyColumns.Add("PARENT_ID", mapping => mapping.Name("PARENT_ID")
                                                               .SqlType("NUMBER")
                                                               .Not.Nullable());