代码之家  ›  专栏  ›  技术社区  ›  Chris Stavropoulos

NHibernate一对多与鉴别器

  •  0
  • Chris Stavropoulos  · 技术社区  · 16 年前

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

    这是我试图映射的域模型的一个示例:

    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: How do I map mutiple parents' children of a common type into a single table?

    1 回复  |  直到 9 年前
        1
  •  0
  •   LeftyX    13 年前

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

    Table Classes (for MyClass/MyOtherClass):
        ClassID (unique primary key)
        ClassType
        ...
    
    Table Dates:
        ClassID (foreign key from above)
        Date (value)
    

    现在,您需要一个抽象基类 MyBaseClass 从中 类名 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>
    

    嗨!