Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом пошаговом руководстве показано, как сопоставить несколько типов сущностей с одной таблицей, изменив модель с помощью конструктора Entity Framework (конструктор EF).
Одна из причин, по которой может потребоваться использовать разделение таблиц, заключается в задержке загрузки некоторых свойств при использовании отложенной загрузки для загрузки объектов. Вы можете разделить свойства, которые могут содержать очень большой объем данных в отдельную сущность и загружать их только при необходимости.
На следующем рисунке показаны основные окна, которые используются при работе с конструктором EF.
Необходимые условия
Для выполнения данного пошагового руководства необходимо выполнить следующие действия.
- Последняя версия Visual Studio.
- Пример школьной базы данных.
Настройка проекта
В этом пошаговом руководстве используется Visual Studio 2012.
- Откройте Visual Studio 2012.
- В меню Файл выберите пункт Создать и затем пункт Проект.
- В левой области щелкните Visual C#, а затем выберите шаблон консольного приложения.
- Введите TableSplittingSample в качестве имени проекта и нажмите кнопку ОК.
Создание модели на основе учебной базы данных
- Щелкните правой кнопкой мыши имя проекта в обозревателе решений, наведите указатель мыши на добавление и выберите пункт "Создать элемент".
- Выберите Данные из меню слева и затем выберите Модель данных сущности ADO.NET в области шаблонов.
- Введите TableSplittingModel.edmx для имени файла и нажмите кнопку "Добавить".
- В диалоговом окне "Выбор содержимого модели" выберите "Создать из базы данных" и нажмите кнопку "Далее".
- Нажмите кнопку "Создать подключение". В диалоговом окне "Свойства подключения" введите имя сервера (например, (localdb)\mssqllocaldb), выберите метод проверки подлинности, введите School для имени базы данных и нажмите кнопку "ОК". Диалоговое окно "Выбор подключения к данным" обновляется с помощью параметра подключения к базе данных.
- В диалоговом окне "Выбор объектов базы данных" разверните узел Таблиц и отметьте таблицу Person. Это добавит указанную таблицу в модель School .
- Нажмите кнопку "Готово".
Отображается конструктор сущностей, предоставляющий графический интерфейс для редактирования модели. Все объекты, выбранные в диалоговом окне "Выбор объектов базы данных ", добавляются в модель.
Сопоставление двух сущностей с одной таблицей
В этом разделе вы разделите сущность Person на две сущности, а затем сопоставите их с одной таблицей.
Замечание
Сущность Person не содержит никаких свойств, которые могут содержать большой объем данных; он просто используется в качестве примера.
- Щелкните правой кнопкой мыши пустую область конструктора, наведите указатель мыши на Добавление нового и нажмите «Сущность». Откроется диалоговое окно "Создать сущность ".
- Введите HireInfo для Имени сущности и PersonID для имени Свойства ключа.
- Нажмите кнопку ОК.
- Новый тип сущности создается и отображается на поверхности конструктора.
- Выберите свойство HireDate типа сущности Person и нажмите клавиши CTRL+X .
- Выберите сущность HireInfo и нажмите клавиши CTRL+V .
- Создайте связь между Person и HireInfo. Для этого щелкните правой кнопкой мыши пустую область области конструктора, наведите указатель на добавление нового и нажмите кнопку "Связь".
- Откроется диалоговое окно "Добавить связь ". Имя PersonHireInfo присваивается по умолчанию.
- Укажите мультиплицитет 1(Один) на обоих концах отношения.
- Нажмите кнопку ОК.
Для следующего шага необходимо окно Сведений о сопоставлении. Если вы не видите это окно, щелкните правой кнопкой мыши на поверхности разработки и выберите пункт "Сведения о сопоставлении".
Выберите тип сущности HireInfo и нажмите <"Добавить таблицу или представление>" в окне Сведения о сопоставлении.
Выберите Персону из <раскрывающегося списка в поле "Добавить таблицу или представление>". Список содержит таблицы или представления, с которыми можно сопоставить выбранную сущность. Соответствующие свойства должны быть сопоставлены по умолчанию.
Выберите связь PersonHireInfo в области конструктора.
Щелкните правой кнопкой мыши на ассоциации в области конструктора и выберите Свойства.
В окне "Свойства" выберите свойство "Ограничения ссылки " и нажмите кнопку с многоточием.
Выберите Личность из раскрывающегося списка Субъект.
Нажмите кнопку ОК.
Используйте модель
- Вставьте следующий код в метод Main.
using (var context = new SchoolEntities())
{
Person person = new Person()
{
FirstName = "Kimberly",
LastName = "Morgan",
Discriminator = "Instructor",
};
person.HireInfo = new HireInfo()
{
HireDate = DateTime.Now
};
// Add the new person to the context.
context.People.Add(person);
// Insert a row into the Person table.
context.SaveChanges();
// Execute a query against the Person table.
// The query returns columns that map to the Person entity.
var existingPerson = context.People.FirstOrDefault();
// Execute a query against the Person table.
// The query returns columns that map to the Instructor entity.
var hireInfo = existingPerson.HireInfo;
Console.WriteLine("{0} was hired on {1}",
existingPerson.LastName, hireInfo.HireDate);
}
- Скомпилируйте и запустите приложение.
Следующие инструкции T-SQL были выполнены в базе данных School в результате выполнения этого приложения.
В результате выполнения context.SaveChanges() была выполнена следующая вставка, которая объединяет данные из сущностей Person и HireInfo.
Вставить комбинированные данные Person и HireInfo
Следующая операция SELECT была выполнена в результате вызова context.People.FirstOrDefault() и выбирает только те столбцы, которые сопоставлены с Person
Следующий параметр SELECT был выполнен в результате доступа к свойству навигации существующегоPerson.Instructor и выбирает только столбцы, сопоставленные с HireInfo.