Fluent Nhibernate связанные предметы - PullRequest
0 голосов
/ 11 июня 2010

Я пытаюсь связать 2 пункта.У меня есть таблица, которая представляет собой просто поле Id, а затем 2 столбца для связывания идентификаторов элементов.Я хочу, чтобы это были двусторонние отношения - то есть, если элементы дважды появляются в таблице, я хочу вернуть только одно соединение отношений.

Итак, вот мой элемент:

public class Item
{
   public virtual Guid ItemId {get; set;}

   public virtual string Name {get; set;}

   public virtual IList<Item> RelatedItems {get; set;}
}

Таблица соотношения предметов выглядит следующим образом:

CREATE TABLE RelatedItems
(
   RelatedItemId   uniqueidentifier   DEFAULT(NEWID()) NOT NULL,
   ItemId          uniqueidentifier   NOT NULL,
   RelatedId       uniqueidentifier   NOT NULL,

   CONSTRAINT PK_RelatedItems PRIMARY KEY CLUSTERED (RelatedItemId)
)

Как лучше всего сопоставить это соединение?

Ответы [ 2 ]

1 голос
/ 14 июня 2010

Вам необходимо использовать отображение «HasMany». Я думаю, что может работать следующее:

public class Item : ClassMap<Item>
{
  Id(x=>x.Id)
    .Column("ItemId");

  Map(x=>x.Name);

  HasMany(x=>x.RelatedItems)
    .KeyColumn("RelatedId")
    .Table("RelatedItems")
    .LazyLoad()
    .AsList();    
}

Вы всегда можете использовать соглашение для поля Id. И рассмотрите варианты каскадного удаления в коллекции HasMany.

0 голосов
/ 14 июня 2010

Мне пришлось сделать это трудным путем (читай HACK).

HasManyToMany(x => x.RelatedTo)
                .Table("RelatedItems")
                .ParentKeyColumn("ItemId")
                .ChildKeyColumn("RelatedItemId");

HasManyToMany(x => x.RelatedToMe)
                .Table("RelatedItems")
                .ChildKeyColumn("ItemId")
                .ParentKeyColumn("RelatedItemId");

Затем в моем классе у меня есть коллекция только для чтения, которая называется RelatedItems, которая объединяет два списка и выбирает отдельные элементы для возврата.

...