Nhibernate сущность с несколькими списками «многие ко многим» одного типа? - PullRequest
7 голосов
/ 16 декабря 2009

Кто-нибудь знает, как мне сопоставить сущность с двумя коллекциями "многие ко многим" одного и того же дочернего типа.

Моя структура базы данных такая ...

"Нормальными" отношениями будут ....

tbl_Parent
  col_Parent_ID

tbl_Parent_Child_Xref
   col_Parent_ID
   col_Child_ID

tbl_Child
   col_Child_ID

Альтернативные отношения ...

tbl_Parent
  col_Parent_ID

tbl_Include_ParentChild_Xref
   col_Parent_ID
   col_Child_ID

tbl_Child
   col_Child_ID

Сущность и отображение выглядят так ...

public partial class ParentEntity : AuditableDataEntity<ParentEntity>
{
  public virtual IList<ChildEntity> Children { get; set; }
  public virtual IList<ChildEntity> IncludedChildren { get; set; }
}

public partial class ParentMap : IAutoMappingOverride<ParentEntity>
{
    public void Override(AutoMapping<ParentEntity> mapping)
    {
        mapping.Table("tbl_Parent");

        mapping.HasManyToMany(x => x.Children)
        .Table("tbl_Parent_Child_Xref")
        .ParentKeyColumn("col_Parent_ID")
        .ChildKeyColumn("col_Child_ID")
        .Inverse()
        .Cascade.All();

        mapping.HasManyToMany(x => x.IncludedChildren)
        .Table("tbl_Include_ParentChild_Xref")
        .ParentKeyColumn("col_Parent_ID")
        .ChildKeyColumn("col_Child_ID")
        .Inverse()
        .Cascade.All();
    }
}

Я получаю ошибку "System.NotSupportedException: не удается выяснить, какой должна быть другая сторона свойства« многие ко многим »« Дети »."

Я использую NHibernate 2.1.2, FluentNhibernate 1.0.

Ответы [ 4 ]

1 голос
/ 27 февраля 2010

Кажется, FNH сбит с толку, потому что вы, кажется, отображаете один и тот же объект (ChildEntity) на две разные таблицы, если я не ошибаюсь.

Если вам не нужно разделять два списка, возможно, использование различающего значения для каждого из ваших списков решит проблему. Ваш первый список ChildEntity будет привязан к значению распознавания A, а вы, например, к различающему значению B.

В противном случае, я бы, возможно, выбрал производный класс вашего ChildEntity, но не имел бы того же имени ChildEntity.

IList<ChildEntity> ChildEntities
IList<IncludedChildEntity> IncludedChildEntities

И оба ваших класса объектов будут идентичными.

Если вы говорите, что это работает с NH, то это может быть ошибкой, как уже говорилось. Однако вы можете смешивать сопоставления XML и AutoMapping с FNH. Так что, если это работает в NH, это, возможно, будет моим предпочтением. Но думаю, что этот обходной путь должен сделать это.

0 голосов
/ 25 декабря 2009

К моему большому сожалению, NHibernate не может этого сделать. Рассмотрите возможность использования другого ORM.

0 голосов
/ 11 февраля 2010

Свободно говорит, что вы дважды ссылаетесь на один и тот же родительский столбец. Это нет-нет. И, насколько я могу судить по активности, которую я видел, исправление не скоро произойдет.

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

0 голосов
/ 17 декабря 2009

Вы знаете, что я просто стреляю в темноте, но похоже, что ваш класс ChildEntity не известен в Hibernate ... это, как правило, где я видел такого рода сообщения. Hibernate проверяет ваш класс и видит этот ссылочный класс (в данном случае ChildEntity), о котором id не знает.

Возможно, вы пошли дальше и нашли проблему в этот момент, но подумали, что я все равно увижу.

...