2009-04-27 18 views
0

Quelqu'un peut-il m'aider à comprendre comment modéliser au mieux une relation de composition?Comment modélisez-vous une relation de composition simple?

Si, par exemple, j'ai un étudiant qui peut avoir de nombreux programmes, je créerais à peu près:

class Student 
{ 
    prop long Pk { get; set; } 
    prop string Name { get; set; } 
    prop List<Schedule> Schedules { get; set; } 
} 

class Schedule 
{ 
    prop string Semester { get; set; } 
    prop List<Course> Courses{ get; set; } 
} 

Quelque part en bas de la ligne, je peux avoir un objet annexe, et souhaiterai identifier quel étudiant il appartient à . Je veux être en mesure d'écrire Schedule.Student.Name, et recevoir le nom de l'étudiant en retour. Est-ce que j'ajoute également une propriété Student à mon objet Schedule?

Mon application a transmis un objet Student Pk à mon objet Schedule afin de réaliser la fonctionnalité CRUD. Je garde la Student PK en tant que variable privée afin de garder le contrôle sur elle si j'en ai besoin. Au fur et à mesure que mon application devient plus complexe, j'ai du mal à maintenir ce que je fais. Quelles sont vos suggestions pour moi? Quoi d'autre puis-je consulter (livres/liens) pour obtenir un rappel et mieux gérer ces fondamentaux?

Répondre

2

"Je veux être en mesure d'écrire Schedule.Student.Name, et recevoir en retour le nom de l'étudiant Dois-je ajouter une propriété Student à mon objet Schedule?" Oui. Ce que vous décrivez (prenant en charge à la fois les clés étrangères pour la recherche et les références d'objet pour faciliter la navigation dans le graphe d'objets) semble très bien correspondre à un ORM (Object-Relational Mapper). Un bon ORM chargera automatiquement l'objet/les objets associés pour vous en utilisant le FK/PK (par exemple, si le Schedule a un champ StudentPK, alors le mappeur s'occupera du chargement/mappage de la propriété Student pour vous). Il existe de nombreux produits de ce type: vous pouvez utiliser des frameworks .NET intégrés tels que Entity Framework, des logiciels open-source tels que NHibernate ou des produits commerciaux tels que LightSpeed, LLBLGen, EntitySpaces ou OpenAccess (divulgation: je travaille pour une entreprise qui fait un ORM commercial). Google pour ORM ou mapper objet-relationnel, ou consultez Wikipedia, pour un aperçu du genre de chose que je décris.

+0

Mais si j'ajoute une propriété d'étudiant à ma propriété annexe, ce qui est me empêche de faire ceci: Student.Schedules [0] .Student.Schedules [1] .Student.Schedules [0] .Student.Schedules [0 ].Prénom. N'est-ce pas une référence circulaire? Est-ce autorisé? –

+0

Oui, c'est autorisé. Il ne provoque pas de régression infinie car (a) si vous créez les objets à la main, vous réutiliserez les objets qui existent déjà (par exemple, lorsque vous créez un Schedule, vous définissez sa propriété Student sur l'Etudiant existant, et non créer un nouvel étudiant) ou (b) si vous utilisez un ORM, il détectera qu'une clé fait référence à un objet existant et le réutilise. La plupart des ORM chargeront par défaut par défaut: par ex. Lors de la construction d'un étudiant, ils rempliraient la collection Schedules lorsque vous le demanderiez (et inversement, ils ne rempliront Schedule.Student que lorsque vous le demanderez). – itowlson