2010-03-16 78 views
0

我需要一個多對多的結構,但有一個聚合約束。 我想要完成的是在純sql中輕鬆完成的,但由於ActiveRecord不鼓勵組合主鍵,我不確定如何在推薦樣式中完成我所需要的操作。複合主鍵方案

這裏是我將不得不在純SQL:

table Project (ID int)

table Report (ProjectWideID nvarchar(50), ProjectID int, primary key (ProjectWideID, ProjectID))

table ChosenReport(ListOrder int, ProjectWideReportID, ReportID, primary key (ProjectID,ProjectWideReportID))

這意味着,一個項目有許多報道。 每個報告都有一個分配的ID,它在項目中是唯一的。 項目有許多選定的報告作爲有序列表,它們中的每一個都通過其項目範圍分配的報告ID引用同一項目中的報告。

但是這裏是我的ActiveRecord類,並且這裏缺少一些東西。現在

[ActiveRecord] 
public class Project 
{ 
[PrimaryKey] 
public int ID { get; set; } 
[HasMany] IList<Report> Reports { get; set; } 
[HasMany] IList<ChosenReport> ChosenReports { get; set; } 
} 

[ActiveRecord] 
public class Report 
{ 
[PrimaryKey] 
public int ID { get; set; } 
[BelongsTo("ProjectID")] 
public Project ParentProject { get; set; } 

// ... other properties 
} 

[ActiveRecord] 
public class ChosenReport 
{ 
// This one must be a key property 
[BelongsTo("ParentProjectID")] 
Project ParentProject { get; set; } 

// This one must be a key property 
[BelongsTo("ParentProjectID")] 
Report ParentReport { get; set; } 

// ... other properties 
} 

,因爲我有代理鍵,我不知道該如何約束ChosenReport所以它不能有參考來自不同項目的報告。所以我必須在域中執行約束。我有ActiveRecord這個任何其他選項嗎?

回答

0

這樣做的真正ActiveRecord方法將使您的類繼承ActiveRecordBase<T>,然後覆蓋OnSave()並在那裏執行您的檢查。但我建議在NHibernate interceptorevent listener中實施檢查邏輯。