Свободное автоматическое сопоставление NHibernate: сущности "один ко многим", бэкэнд "многие ко многим"?

Моя цель - использовать создание схемы NHibernate вместе с автоматом Fluent NHibernate для создания моей базы данных. У меня проблемы с тем, что я называю «однонаправленными отношениями многие ко многим».

Многие из моих организаций имеют локализованные ресурсы. Один класс может выглядеть так:

public class Something {
  public virtual int Id {get; private set;}
  public virtual Resource Title {get;set;}
  public virtual Resource Description {get;set;}
  public virtual IList<Resource> Bullets {get;set;}
}

Класс Resource не имеет обратной ссылки; они полностью однонаправлены.

public class Resource {
    public virtual int Id {get; private set;}
    public virtual IList<LocalizedResource> LocalizedResources {get;set;}
    // etc.
}
public class LocalizedResource { // 
    public virtual int Id {get; private set; }
    public virtual string CultureCode {get;set;}
    public virtual string Value {get;set;}
    public virtual Resource Resource {get;set;}
}

Без IList<Resource> все сгенерировано так, как я хотел - идентификаторы ресурса находятся в полях Title и Description. Когда я добавляю IList, NHibernate добавляет поле something_id в таблицу Resource. Я понимаю, почему он это делает, но в данной ситуации это не рациональный подход.

Я хочу создать таблицу соединений для пуль. Что-то типа:

CREATE TABLE SomethingBullet (
  Id int NOT NULL PRIMARY KEY IDENTITY(1,1),
  Something_Id int NOT NULL,
  Resource_Id int NOT NULL
)

Таким образом, когда я добавлю в базу данных еще двадцать с лишним объектов, я не получу до смешного широкую и разреженную Resource таблицу.

Как заставить Automapper обрабатывать все IList<Resource> свойства таким образом?


person roufamatic    schedule 11.02.2012    source источник


Ответы (2)


Фактически, каждое «многие ко многим» состоит из объектной модели «один ко многим». Если ваши отношения не должны быть двунаправленными, просто не отображайте вторую сторону. Отображение на вашей отображаемой стороне вообще не затрагивается:

HasManyToMany(x => x.Bullets).AsSet();

В этом случае NHibernate уже знает, что ему нужно сгенерировать промежуточную таблицу.

См. Также эту статью для многие ко многим советы.

person NOtherDev    schedule 11.02.2012
comment
+1 - посетите связанный блог, чтобы получить отличное руководство о том, как выполнять сопоставление как с FNH, так и с новым NH Mapping by Code. - person Tom Bushell; 13.02.2012

:)

Единственный способ, которым я нашел эту работу с автоматическим отображением, - это создать свой собственный шаг автоматического сопоставления и заменить «родной» HasManyToManyStep. Боюсь, это либо так, либо переопределение.

Я взял свой из Самера Абу Раби, размещенного здесь.

Хорошая новость заключается в том, что код Самера до сих пор, кажется, безупречно работает с моими соглашениями и прочим, поэтому, когда он был на месте, он был полностью прозрачен для всего остального в моем коде.

Плохая новость заключается в том, что это стоит вам возможности иметь однонаправленные отношения «один-ко-многим», поскольку код Самера предполагает, что все однонаправленные отношения «x-ко-многим» являются «многие-ко-многим». В зависимости от вашей модели это может быть хорошо, а может и не быть.

Предположительно, вы могли бы создать другую реализацию ShouldMap, которая будет различать то, что вы хотите быть «многие ко многим», и то, что вы хотите быть «один ко многим», и тогда все снова будет работать. Обратите внимание, что для замены встроенного HasManyToManyStep потребуется два настраиваемых шага, хотя, опять же, код Самера - хорошая отправная точка.

Сообщите нам, как это происходит. :)

Ура,
J.

person João Mendes    schedule 04.09.2012