Вопрос об объектах, ролях и интерфейсах в Entity Framework 4 - PullRequest
0 голосов
/ 14 мая 2010

Я опытный разработчик .NET, но плохо знаком с EF, поэтому, пожалуйста, потерпите меня. Я буду использовать пример приложения колледжа, чтобы проиллюстрировать мою проблему. У меня есть эти роли пользователя:

Лектор, студент, администратор.

В моем коде я предполагаю работать с этими объектами как с отдельными классами, например, Преподаватель преподает коллекцию студентов. И работа со студентами, TypeOf и т. Д.

Каждый из этих объектов имеет много общих свойств / методов, например, все они могут войти в систему и делать вещи, связанные с их ролью.

В конструкторе EF я могу создать базовую сущность Person (или User ...) и наследовать от нее лектора, студента и администратора.

Трудность, с которой я столкнулся, заключается в том, что лектор может быть администратором, а на самом деле иногда студент может быть лектором.

Если я добавлю другие объекты, такие как Сотрудник и Начальник, тогда это станет еще более серьезной проблемой.

Я мог бы предположительно работать с интерфейсами, чтобы человек мог реализовать ILecturer и IStudent, однако я не вижу, как это вписывается в EF.

Я хотел бы поработать в EF-дизайнере, если это возможно, и я работаю сначала на модели (кодирую в C #).

Так что любая помощь и совет / образцы будут очень приветствоваться и высоко ценится.

Спасибо

1 Ответ

0 голосов
/ 14 мая 2010

Не заставляйте Student и Lecturer наследовать от Person. Как вы говорите, что, если «Боб» был и студентом, и лектором? Это происходит все время в реальных колледжах. Вы сказали, что лучше сами: это роли , а не типы. Человек может иметь много ролей.

Как правило, избегайте наследования при отображении O / R, когда это не является строго необходимым (а это почти никогда). Как и при кодировании, отдавайте предпочтение композиции, а не наследованию.

Таким образом, вы могли бы дать каждому Person свойство Roles, которое является 0 .. * коллекцией Role с. Затем, чтобы получить список студентов, вы можете сделать:

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

или у вас может быть связанный тип Student с отношением 0..1 между Person и Student; это позволит вам добавить дополнительные данные для студента, например ::1010 *

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