Отображение на несколько таблиц с помощью Fluent nHibernate - PullRequest
8 голосов
/ 24 января 2012

Вот моя ситуация ..
Предположим, у вас есть следующие объекты модели, которые представляют отдельные таблицы самостоятельно:

Фильмы [Movie_Id, название, рейтинг, ..]
Актеры [Actor_Id, FirstName, LastName, ..]
Директор [Director_Id, Имя, Фамилия, ..]

И еще одна сущность / таблица под названием «Рекомендации», которая представляет рекомендации между пользователями на веб-сайте. Идея состоит в том, что рекомендация может быть любого типа, т.е. кто-то рекомендует актера или кто-то рекомендует фильм. По сути, таблица должна выглядеть примерно так:

Рекомендации [Рекомендации_Id, Object_Id, Object_Type, ..]

И вот что я застрял в. Как я могу сопоставить эти отношения в nHibernate с Fluent? Я имею в виду ... во время отображения я не могу указать тип (с какой таблицей связан), потому что он определяется во время выполнения, но я не могу полагаться только на идентификатор, потому что сам по себе он не может подразумевать, к какой таблице принадлежит.
Например, представьте эту запись в таблице рекомендаций:

Recommendation_Id - Object_ID - Тип_объект
83001--4010123 --- "M"

В основном я храню идентификатор символа (в данном случае «M» обозначает таблицу «Movies»), чтобы знать, к какой таблице принадлежит Object_Id. Я не могу просто сохранить Object_Id без Object_Type ..

В качестве заключительного комментария я хотел бы добавить, что я видел все примеры таблица-на-класс, таблица-на-подкласс, таблица-на-конкретный класс, но я считаю, что ни один из этих подходов не подходит Ситуация, когда Movies_Id, Actors_Id, Director_Id, ... все они различны, как и Рекомендации_Id. Я имею в виду, что здесь нет наследования базового класса и дочернего класса, они вообще не разделяют идентификаторы ..

Надеюсь, я проясню. Заранее спасибо.

1 Ответ

13 голосов
/ 24 января 2012

Картограф NHibernate, который вы ищете, <any/>.Вот несколько ресурсов, которые помогут вам освоиться с этой функцией отображения NHibernate:

Я считаю, что файл * .hbm.xml, по которому вы снимаете, выглядит примерно так:

<class name="Recommendation" table="Recommendations">
  <id name="Id">
    <column name="Recommendation_Id" />
    <generator class="native"/>
  </id>

  <any name="RecommendedObject" id-type="System.Int32" meta-type="System.String">
    <meta-value value="M" class="Movie"/>
    <meta-value value="A" class="Actor"/>
    <meta-value value="D" class="Director"/>
    <column name="Object_Type"/>
    <column name="Object_Id"/>
  </any>

  <!-- other stuff ... -->
</class>

Вы должны быть в состоянии сделать это с помощью Fluent NHibernate, как показано в рекомендации Рекомендации:

ReferencesAny(x => x.RecommendedObject)
    .IdentityType<int>()
    .EntityTypeColumn("Object_Type")
    .EntityIdentifierColumn("Object_Id")
    .AddMetaValue<Movie>("M")
    .AddMetaValue<Actor>("A")
    .AddMetaValue<Director>("D");
...