0

Je suis un développeur .NET expérimenté, mais nouveau à EF - alors s'il vous plaît garder avec moi. Je vais utiliser un exemple d'une application de collège pour illustrer mon problème. J'ai ces rôles d'utilisateur:Une question sur les entités, les rôles et les interfaces dans Entity Framework 4

Maître de conférences, étudiant, administrateur.

Dans mon code, je prévois de travailler avec ces entités en tant que classes distinctes, par ex. Un conférencier enseigne une collection d'étudiants. Et travailler avec 'est' TypeOf 'de Student.

Chacune de ces entités partage beaucoup de propriétés/méthodes communes, par ex. ils peuvent tous se connecter au système et faire des choses liées à leur rôle.

Dans le concepteur EF, je peux créer une entité de base Personne (ou Utilisateur ...) et avoir Lecturer, Étudiant et Administrateur en hériter. La difficulté que j'ai est qu'un conférencier peut être un administrateur - et en fait à l'occasion un étudiant peut être un conférencier.

Si j'ajoutais d'autres entités telles que Employee et Warden, cela poserait encore plus de problèmes.

Je pourrais probablement travailler avec des interfaces afin qu'une personne puisse implémenter ILecturer et IStudent, mais je ne vois pas comment cela s'intègre dans EF.

Je voudrais travailler dans le concepteur EF si possible et je travaille d'abord sur le modèle (codage en C#).

Donc toute aide et conseil/échantillon serait très apprécié et très apprécié.

Merci

Répondre

0

Ne pas faire Student et Lecturer Hériter de Person. Comme vous le dites, et si "Bob" était à la fois un étudiant et un conférencier? Cela arrive tout le temps dans de vrais collèges. Vous avez dit le mieux vous-même: Ce sont rôles, pas les types. Une personne peut avoir plusieurs rôles.

En règle générale, évitez l'héritage dans le mappage O/R lorsque ce n'est pas strictement nécessaire (ce qui n'est presque jamais le cas). Tout comme lors du codage, privilégiez la composition par rapport à l'héritage.

Vous pourrait donner à chaque Person une propriété Roles qui est un 0 .. * collection de Role s. Ensuite, pour obtenir une liste des étudiants, vous pouvez faire:

var students = from p in Context.People 
       where p.Roles.Any(r => r.Id = studentRoleId) 
       select p; 

Ou vous pourriez avoir un type Student lié à une relation entre 0..1 Person et Student; cela vous permettra d'ajouter des données supplémentaires pour l'étudiant, par exemple:

var students = from p in Context.People 
       where p.StudentInfo != null 
       select new 
       { 
        Id = p.Id, 
        Name = p.Name, 
        Grades = p.Student.Grades 
       }; 
+0

Salut Craig, c'est très utile merci! Je considérais un modèle basé sur le rôle de la personne (plusieurs à plusieurs) avec un profil associé, donc une personne qui prend un rôle d'étudiant a aussi un profil d'étudiant associé. Ça semble fonctionner plutôt bien. Merci encore. – mvole

Questions connexes