Свободное автоматическое сопоставление NHibernate: один-ко-многим объектам, многие-ко-многим бэкэнд? - PullRequest
3 голосов
/ 11 февраля 2012

Моя цель - использовать генерацию схемы 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> свойства таким образом?

Ответы [ 2 ]

4 голосов
/ 11 февраля 2012

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

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

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

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

0 голосов
/ 04 сентября 2012

:)

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

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

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

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

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

Дайте нам знать, как это происходит. :)

Cheers,
J.

...