NHibernate один ко многим с дискриминатором - PullRequest
0 голосов
/ 09 октября 2009

У меня возникла проблема с отображением, которое я бы назвал довольно простой ассоциацией.

Вот пример модели домена, которую я пытаюсь отобразить:

public class MyClass
{
    IDictionary<string, DateTime> Dates { get; set; }
}


public class MyOtherClass
{
    IDictionary<string, DateTime> Dates { get; set; }
}

Я бы хотел, чтобы свойство Dates отображалось в одну таблицу, примерно так:

TABLE Dates
COLUMNS
    ParentId    (Parent class key value)
    ParentType  (Parent class type)
    DateType    (Index value for dictionary)
    DateValue
SAMPLE
ParentId        ParentType  DateType    DateValue
----------------------------------------------------------
1               MyClass             TYPEA       2009-10-09
1               MyOtherClass        TYPEA       2009-11-08

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

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

Есть идеи относительно того, как это должно быть отображено?

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

1 Ответ

0 голосов
/ 09 октября 2009

Дискриминация должна быть между MyClass и MyOtherClass, а не в таблице Даты. Вам нужна структура базы данных, подобная этой:

Table Classes (for MyClass/MyOtherClass):
    ClassID (unique primary key)
    ClassType
    ...

Table Dates:
    ClassID (foreign key from above)
    Date (value)

Теперь вам нужен абстрактный базовый класс MyBaseClass, из которого происходят MyClass и MyOtherClass, и тогда ваше отображение будет примерно таким (псевдокод, не ожидайте, что он будет полностью корректным):

<class="MyBaseClass", abstract="true" table="Classes">
  <id .../>
  <set name="Dates"... />
  <discriminator column="ClassType"/>
  <subclass type="MyNamespace.MyClass, MyAssembly" discriminator-value="'MyClass'">
    ...
  </subclass>
  <subclass type="MyNamespace.MyOtherClass, MyAssembly" discriminator-value="'MyOtherClass'">
    ...
  </subclass>
</class>

НТН!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...