Самостоятельно ссылаясь на отношения многие ко многим в автоматическом преобразовании Fluent NHibernate до 1: n, а не n: n - PullRequest
10 голосов
/ 14 марта 2011

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

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

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

Инструмент генерации схемы делает его отношением 1: 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 column: Member_id "

Спасибо

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

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

Ответы [ 3 ]

5 голосов
/ 21 октября 2011

Чтобы мне больше не приходилось видеть этот вопрос в верхней части списка «Неотвеченных вопросов NHibernate» ...

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

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

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

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

0 голосов
/ 05 апреля 2015

Ну, я понимаю, что у меня похожая проблема с небольшим изменением.Можете ли вы попробовать ответить на вопрос по ссылке

Текущее отображение m-to-m n-hibernate с внешней таблицей

0 голосов
/ 03 сентября 2014
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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...