2

这是我希望拥有的域:

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 个(对于人员和证书)进行映射?

4

5 回答 5

5

根据设计,NHibernate 仅支持隐式多对多映射,如果除了中间(中间)表中表示的持有多对多关系的 FK 对之外,没有其他任何东西。

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

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

于 2009-01-24T18:46:04.600 回答
1

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

于 2009-01-23T17:33:57.680 回答
0

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

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

于 2009-01-23T06:23:17.660 回答
0

我会将 CertificatesAcquiredByPeople 重命名为 CertificatesAcquiredEvent
之类的名称(这意味着有多个密钥和一个日期时间)

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

于 2009-01-23T06:40:06.750 回答
0

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

于 2009-01-24T18:55:46.547 回答