Сценарий составного первичного ключа - PullRequest
0 голосов
/ 16 марта 2010

Мне нужна структура "многие ко многим", но с совокупным ограничением. То, что я пытаюсь сделать, легко сделать в чистом 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))

Это означает, что у проекта много отчетов. Каждый отчет имеет назначенный идентификатор, который является уникальным внутри проекта. В проекте есть много выбранных отчетов в виде упорядоченного списка, каждый из которых ссылается на отчет в том же проекте по назначенному для проекта идентификатору отчета.

Но вот мои классы 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?

1 Ответ

0 голосов
/ 16 марта 2010

Настоящий способ ActiveRecord - это сделать ваши классы наследуемыми от ActiveRecordBase<T>, а затем переопределить OnSave() и реализовать там ваши проверки. Но я рекомендую реализовать логику проверки в перехватчике NHibernate или прослушивателе событий .

...