2009-10-09 4 views
0

У меня проблема с отображением того, что, по моему мнению, является довольно простой ассоциацией.NHibernate от одного до многих с дискриминатором

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

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


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

Я хотел бы свойство Даты должны отображаться в одну таблицу, что-то вроде этого:

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: How do I map mutiple parents' children of a common type into a single table?), но это решение оказалось в кросс-таблицах по всему месту, что на самом деле не является результатом, которого я пытаюсь достичь.

+1

Что было не так с моделью наследования? Использование суперкласса MyClassBase с IDictionary Dates {get; set;} Это было упомянуто в другом вопросе? Это позволит вам повторно использовать одну и ту же таблицу и использовать столбец дискриминатора –

+0

Проблема, которую я вижу с моделью наследования, заключается в том, что у меня нет общего базового класса. Лучший случай, который я могу придумать, - создать интерфейс с свойством IDictionary Dates, но тогда у меня есть случай реализовать и сопоставить несколько интерфейсов, так как моя реальная модель имеет несколько коллекций разных такие типы, которые должны отображаться. Кажется, это очень быстро становится очень сложным. –

ответ

0

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

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

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

Теперь вам нужен абстрактный базовый класс, от которого MyBaseClassMyClass и 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> 

HTH!

+0

Это по-прежнему зависит от общего базового класса, которого у меня нет, и не подходит для его создания. –

+0

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

+0

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

Смежные вопросы