2009-01-23 60 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,則需要三個映射,對於現在參與這對一對多關係的三個實體中的每一個都有一個。

相關問題