NHibernate与鉴别器一对多

时间:2009-10-09 13:03:38

标签: c# nhibernate

我遇到了一个问题,我认为这是一个相当简单的关联。

以下是我想要映射的域模型示例:

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,因为这就是我现在正在尝试做的事情,但它可以很容易地成为任何类型,甚至是我想要以相同方式建模的另一个自定义类。 / p>

是否应该如何映射?

我认为这类似于我之前提出的一个问题(NHibernate: How do I map mutiple parents' children of a common type into a single table?)但是这个解决方案最终出现在整个地方的交叉路口,这实际上并不是我想要实现的结果。

1 个答案:

答案 0 :(得分:0)

歧视必须在MyClassMyOtherClass之间,而不是在日期表中。您需要这样的数据库结构:

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!