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