2010-03-16 4 views
0

J'ai besoin d'une structure de plusieurs à plusieurs, mais avec une contrainte d'agrégation. Ce que j'essaye d'accomplir est fait facilement en SQL pur, mais puisque ActiveRecord décourage les clés primaires composites, je ne suis pas sûr de savoir comment accomplir ce dont j'ai besoin dans le style recommandé.Scénario de clé primaire composite

Voici ce que j'aurais dans sql pur:

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))

Cela signifie qu'un projet a de nombreux rapports. Chaque rapport a un ID affecté, qui est unique dans un projet. Le projet a de nombreux rapports choisis comme une liste ordonnée, chacun d'entre eux référence un rapport dans le même projet par son ID de rapport attribué à l'échelle du projet.

Mais voici mes classes ActiveRecord, et quelque chose manque ici.

[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 
} 

Maintenant, puisque j'ai les clés de substitution, je ne sais pas comment la contrainte ChosenReport donc il ne peut pas se référer à un rapport de projet différent. Je dois donc appliquer des contraintes dans le domaine. Ai-je d'autres options pour cela avec ActiveRecord?

Répondre

0

La véritable méthode ActiveRecord consiste à faire hériter vos classes de ActiveRecordBase<T>, puis de surcharger OnSave() et d'y implémenter vos vérifications. Mais je recommande d'implémenter la logique de vérification dans un NHibernate interceptor ou event listener à la place.

Questions connexes