2013-11-20 6 views
1

Я хотел начать использовать Entity Framework для своих проектов. Новый проект, который мы скоро начнем, будет иметь таблицу Employee. Первоначально планировалось, что у меня будет интерфейс IEmployee, который будет реализован классами Менеджера и персонала, которые позволят использовать разные функции, но оба будут хранить данные в таблице Employee, а флаг в таблице будет отличаться.Могу ли я добавить свои собственные классы в структуру сущностей?

Если я использую БД Сначала создаю таблицу Employee, а затем использую Entity Framework, я знаю, что файл .tt будет иметь частичный класс Employee. Затем я мог бы создать свои собственные классы менеджера и персонала, которые реализуют частичный класс Employee. Но тогда, как я буду хранить это обратно в db, используя Entity Framework? Могу ли я просто сделать что-то вроде

// currentManager would be the manager object 
dbContext.Emplyee.Add(currentManager); 
dbContext.SaveChanges(); 

бы рамки объекта будет хорошо с этим, даже если я передаю объект диспетчера в Employee, чтобы сохранить? Или есть лучший способ сделать это? То же самое с извлечением, как я могу использовать Entity Framework для возврата менеджера или персонала? Должен ли я сначала вернуть сотрудника, а затем бросить его? Что-то вроде

var employee = from employees... // get employee 
Manager currentManager = (Manager)employee; 

ответ

2

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

«Флаг», который вы представляете, называется дискриминатором от EF. Это столбец в таблице, который указывает, какой подтип является экземпляром записи.

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

  1. Создание модели базы данных в SQL, будучи уверенным, что таблица Employee имеет свойство NOT NULL, как EmployeeType, которые могут быть использованы в качестве дискриминатора. Я думаю, что это может быть любой тип, но int будет работать нормально.
  2. Создайте свою EF-модель (Добавить | Новый элемент ... | Данные | ADO.NET Entity Data Model) и сопоставьте таблицу Employee (и все, что вам нужно).
  3. Дважды щелкните по созданному .edmx-файлу, чтобы открыть конструктор фреймворка.
  4. Щелкните правой кнопкой мыши на холсте и выберите Добавить новое ... | Объект и создать объект Manager, который происходит от Employee. Повторите для Staff.. Ваш дизайнер должен выглядеть так: Entities
  5. Щелкните правой кнопкой мыши на Диспетчере и выберите Таблица Сопоставление. В параметрах сопоставления укажите, что он соответствует Employee и добавляет условие, которое равно Когда EmployeeType = 1. Сделайте то же самое для Staff, но сделайте отображение When EmployeeType = 2. screenshot of mapping details
  6. Последнее, что вам нужно удалитьEmployeeType Недвижимость с Employee картирование.

Это делается, вы можете расширить Manager и Staff классы (которые теперь будут генерироваться EF как частичные классы), чтобы иметь все, что бизнес-логика вы хотите, и делать запросы/и т.д. с EF через Employees отображения:

public class Manager : Employee 
{ 
    public void customManagerMethod() { } 
} 

public class Staff : Employee 
{ 
    public void customStaffMethod() { } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var db = new dbfirstEntities()) 
     { 
      Manager m = new Manager 
      { 
       FirstName = "Joe", 
       LastName = "Bigshot" 
      }; 

      Staff s = new Staff 
      { 
       FirstName = "Joe", 
       LastName = "Schmoe" 
      }; 

      db.Employees.Add(m); 
      db.Employees.Add(s); 

      db.SaveChanges(); 
     } 
    } 
} 
Смежные вопросы