Код EF сначала отображает несколько классов в одну таблицу - PullRequest
1 голос
/ 26 июля 2011

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

Базовый пример структуры таблиц:

Site
----
Id
Name

Person
------
Id
Name
Dob
Address
Rank
Age
SiteId

PersonRoleLink
--------------
PersonId
RoleId

Role
----
Id
Name

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

В зависимости от роли человека зависит, какие свойства будут заселены.

В идеале я хотел бы, чтобы структура класса была следующей:

public class Site {
  public int Id { get; set; }
  public string Name { get; set; }

  public virtual ICollection<Customer> Customers { get; set; }
  public virtual ICollection<Employee> Employees { get; set; }
  public virtual ICollection<Manager> Managers { get; set; }
}

public class PersonBase {
  public int Id { get; set; }
  public string Name { get; set; }

  public virtual Site Site { get; set; }
}

public class Customer : PersonBase {
  public string Name { get; set; }
  public DateTime Dob { get; set; }
}

public class Employee: PersonBase {
  public int Age { get; set; }
}

public class Manager: PersonBase {
  public int Rank { get; set; }
}

Где Customer, Employee и Manager все взяты из таблицы Person и зависят от соответствующей ссылки в таблице PersonRoleLink.

Поэтому, когда я вызываю что-то вроде Site.Managers, возвращаются строки в таблице Person с правильной версией SiteId и ссылкой на Role с именем 'Manager'

Возможна ли эта структура сначала в коде? Если да, то как достигается сопоставление для этого и, если нет, есть ли жизнеспособные альтернативы этой структуре?

Спасибо

1 Ответ

1 голос
/ 27 июля 2011

Это невозможно с EF, потому что это сопоставление, управляемое данными, и код EF сначала не поддерживает его, за исключением одного исключения: отображение наследования таблицы на иерархию, где значение одного столбца в отображаемой таблице может отличаться от отображаемых дочерних объектов.В вашем случае значение, отличающееся от типа сущности, находится в двух отношениях.Более того, одна запись из таблицы person может представлять несколько экземпляров объекта.Это еще одна проблема, потому что у этих экземпляров не будет уникального ключа, и EF не сможет этого сделать.

Обычно ваша предполагаемая объектная модель неверна, поскольку у вас может быть один человек, который является сотрудником и менеджером.Это не должно приводить к двум разным объектам "Person".Пользователь Person напрямую со свойством навигации к ролям и создания вспомогательных методов для получения менеджеров, сотрудников и клиентов.

...