полиморфные ассоциации и таблицы расщепления - PullRequest
2 голосов
/ 05 июля 2011

В моей базе данных SQL Server есть 3 таблицы:

  • Учитель
  • Ученик
  • Родитель

Каждая из этих таблицсодержит некоторые столбцы, которые также находятся в других, например:

  • Имя
  • Фамилия

Все остальные столбцы различны.Это устаревшая база данных.Я не могу изменить его.

В моем коде на C # я хотел бы иметь:

public partial class Person
{
    public string FirstName { get; set; }
    public string Surname { get; set; }

    public virtual ICollection<Role> Roles { get; set; }
}

public interface Role
{
}

public partial class Teacher : Role
{   
    public string School { get; set; }
}

public partial class Student : Role
{
    public string YearLevel { get; set; }
}

public partial class Parent : Role
{
    public string Blagh { get; set; }
}

То есть полиморфную связь «многие-к-одному» между ролью и человеком.

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

У меня вопрос: какую технологию я должен использовать для заполнения бизнес-объектов из базы данных?

Я смотрел на материал Entity Framework 4.1 DbContext;Мне нравится подход аннотации данных, но может ли он делать то, что я хочу?Если нет, может ли Fluent API?

Если Entity Framework не может этого сделать, то как насчет NHibernate (желательно с использованием атрибутов) или Linq-to-SQL?

Я знаю NHibernateможет обрабатывать полиморфную ассоциацию, но можно ли это сделать, когда мы разбиваем таблицы между сущностями, как здесь?

1 Ответ

2 голосов
/ 05 июля 2011

Самое близкое, что вы можете получить с помощью Entity Framework, это Наследование TPC :

public abstract class Person
{
    public string FirstName { get; set; }
    public string Surname { get; set; }
}

public partial class Teacher : Person
{   
    public string School { get; set; }
}

public partial class Student : Person
{
    public string YearLevel { get; set; }
}

public partial class Parent : Person
{
    public string Blagh { get; set; }
}

Ничего более, потому что:

  • EF не может отобразить несколькообъекты в одну и ту же таблицу без наследования или разбиения таблицы
  • EF не может отобразить несколько отношений на одно свойство навигации
  • Учитель и Родитель всегда будут двумя разными не связанными лицами.

Я сомневаюсь, что NHibernate поддерживает это, потому что то, что вы показали, не является чистой полиморфной ассоциацией (все еще есть проблема с недетерминированным отображением Person), но, возможно, кто-то удивит меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...