我遇到了一个问题,我认为这是一个相当简单的关联。
以下是我想要映射的域模型示例:
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?)但是这个解决方案最终出现在整个地方的交叉路口,这实际上并不是我想要实现的结果。
答案 0 :(得分:0)
歧视必须在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>
HTH!