【问题标题】:Many-to-many mapping with extra columns in join table连接表中带有额外列的多对多映射
【发布时间】:2009-01-23 06:14:34
【问题描述】:

这是我希望拥有的域:

public class Person
{
    public int Id { get; set; }
    public IList<AcquiredCertificate> AcquiredCertificates { get; set; }
}

public class AcquiredCertificate
{
    public Person Acquirer { get; set; }
    public Certificate Certificate { get; set; }
    public DateTime DateAcquired;
}

public class Certificate
{
    public int Id { get; set; }     
}

这是我拥有的架构:

CREATE TABLE People (
    PersonId INT PRIMARY KEY
);

CREATE TABLE Certificates (
    CertificateId INT PRIMARY KEY
);

CREATE TABLE CertificatesAcquiredByPeople (
    PersonId INT,
    CertificatedId INT,
    DateAcquired DATETIME
);

这是一个人为的架构和域,但它与我正在使用的东西几乎相同。我目前通过编写第三个域实体来表示 CertificatesAcquiredByPeople 表,但这对我来说真的很奇怪。

我将如何使用 NHibernate 映射它?我相信 hbm 文件中的组件标签应该做我想做的事,但我不太明白。

我的域是否因为我的证书类上有 DateAcquired 属性而出现问题?日期实际上只是拥有证书的人的关注点。

[编辑]

我现在更改了域模型以反映需要一个新实体。现在对于映射,我需要 3 个(对于每个实体)映射还是可以使用 2 个(对于人员和证书)?

【问题讨论】:

    标签: orm nhibernate-mapping domain-driven-design


    【解决方案1】:

    根据设计,NHibernate 仅支持隐式多对多映射,前提是除了中间(中间)表中表示的保持多对多关系的 FK 对之外绝对没有其他内容。

    前段时间,Billy McCafferty 在博客中谈到了这个确切的“问题”(自其 BY DESIGN 以来并不是真正的问题)...

    http://devlicio.us/blogs/billy_mccafferty/archive/2008/07/11/when-to-use-many-to-one-s-vs-many-to-many-with-nhibernate.aspx

    【讨论】:

      【解决方案2】:

      如果您要获得 DateTime 值,我认为您需要 3。

      【讨论】:

      • 谢谢,我也是这么想的,但我只是想换个角度来验证一下。
      【解决方案3】:

      您的实现完全正确。您的连接表包括两个键字段(为表创建一个复合主键),而 datetime 字段是多余的。它实际上是连接表上的一个额外属性,为此您需要一个实体。

      在 UML 类图上,它也会显示为连接上的属性。

      【讨论】:

      • 谢谢!我现在重新表述了这个问题,以便更具体地针对映射。
      【解决方案4】:

      我会重命名 CertificatesAcquiredByPeople
      比如 CertificatesAcquiredEvent (这意味着有不止一个键和一个日期时间)

      我同意就 NHibernate 而言它需要是一个单独的实体。

      【讨论】:

      • 谢谢!我现在重新表述了这个问题,以便更具体地针对映射。
      【解决方案5】:

      回复:您更新后的 Q,您将需要三个映射,一个用于现在参与一对多关系对的三个实体中的每一个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        • 2013-10-21
        • 1970-01-01
        • 2012-10-31
        • 1970-01-01
        相关资源
        最近更新 更多