2009-01-23 108 views
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(对于Person和Certificate)来完成映射?

回答

0

您的实施完全正确。您的连接表包含两个关键字段(为表格创建一个组合主键),并且datetime字段对此是多余的。它实际上是连接表上的一个额外属性,因此您需要一个实体。

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

+0

谢谢!我现在已经把这个问题改写为更具体的映射。 – 2009-01-23 07:03:29

0

我会重新命名CertificatesAcquiredByPeople东西
像CertificatesAcquiredEvent(这意味着有多个键和一个日期)

我同意它需要一个单独的实体至于NHibernate的关注。

+0

谢谢!我现在已经把这个问题改写为更具体的映射。 – 2009-01-23 07:04:02

1

我认为你需要3,如果你打算得到日期时间值。

+0

谢谢,这就是我的想法,但我只是想从另一组眼睛验证。 – 2009-01-23 17:41:58

0

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

相关问题