Разделение сущностей дизайнера

В этом пошаговом руководстве показано, как сопоставить тип сущности с двумя таблицами, изменив модель с помощью конструктора Entity Framework (конструктор EF). Сущность можно сопоставить с несколькими таблицами, если таблицы совместно используют общий ключ. Основные понятия, применяемые к сопоставлению типа сущности с двумя таблицами, легко расширяются для сопоставления типа сущности с более чем двумя таблицами.

На следующем рисунке показаны основные окна, которые используются при работе с конструктором EF.

Конструктор EF

Необходимые условия

Visual Studio 2012 или Visual Studio 2010, Ultimate, Premium, Professional или Web Express edition.

Создание базы данных

Сервер базы данных, установленный с Visual Studio, отличается в зависимости от установленной версии Visual Studio:

  • Если вы используете Visual Studio 2012, вы создадите базу данных LocalDB.
  • Если вы используете Visual Studio 2010, вы создадите базу данных SQL Express.

Сначала мы создадим базу данных с двумя таблицами, которые мы собираемся объединить в одну сущность.

  • Запустите Visual Studio
  • Вид —> Обозреватель серверов
  • Щелкните правой кнопкой мыши Подключения к данным — Добавить подключение...
  • Если вы не подключались к базе данных из Обозревателя серверов ранее, вам нужно выбрать Microsoft SQL Server в качестве источника данных.
  • Подключитесь к LocalDB или SQL Express в зависимости от того, что у вас установлено
  • Введите EntitySplitting в качестве имени базы данных
  • Нажмите кнопку "ОК ", и вам будет предложено создать новую базу данных, нажмите кнопку "Да"
  • Теперь новая база данных появится в обозревателе серверов
  • Если вы используете Visual Studio 2012
    • Щелкните правой кнопкой мыши базу данных в обозревателе серверов и выберите команду "Создать запрос"
    • Скопируйте следующий SQL в новый запрос, а затем щелкните правой кнопкой мыши запрос и выберите "Выполнить".
  • Если вы используете Visual Studio 2010
    • Выберите Data -> редактор Transact-SQL -> Новое подключение для запроса...
    • Введите .\SQLEXPRESS в качестве имени сервера и нажмите кнопку "ОК"
    • Выберите базу данных EntitySplitting в раскрывающемся списке в верхней части редактора запросов.
    • Скопируйте следующий SQL в новый запрос, а затем щелкните правой кнопкой мыши запрос и выберите "Выполнить SQL"
CREATE TABLE [dbo].[Person] (
[PersonId] INT IDENTITY (1, 1) NOT NULL,
[FirstName] NVARCHAR (200) NULL,
[LastName] NVARCHAR (200) NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonId] ASC)
);

CREATE TABLE [dbo].[PersonInfo] (
[PersonId] INT NOT NULL,
[Email] NVARCHAR (200) NULL,
[Phone] NVARCHAR (50) NULL,
CONSTRAINT [PK_PersonInfo] PRIMARY KEY CLUSTERED ([PersonId] ASC),
CONSTRAINT [FK_Person_PersonInfo] FOREIGN KEY ([PersonId]) REFERENCES [dbo].[Person] ([PersonId]) ON DELETE CASCADE
);

Создание проекта

  • В меню Файл выберите пункт Создать и затем пункт Проект.
  • В левой области щелкните Visual C#, а затем выберите шаблон консольного приложения .
  • Введите MapEntityToTablesSample в качестве имени проекта и нажмите кнопку "ОК".
  • Нажмите "Нет", если появится запрос на сохранение SQL-запроса, созданного в первом разделе.

Создание модели на основе базы данных

  • Щелкните правой кнопкой мыши имя проекта в обозревателе решений, наведите указатель мыши на добавление и выберите пункт "Создать элемент".
  • Выберите данные из меню слева и выберите ADO.NET модель данных сущности в области шаблонов.
  • Введите MapEntityToTablesModel.edmx для имени файла и нажмите кнопку "Добавить".
  • В диалоговом окне "Выбор содержимого модели" выберите "Создать из базы данных" и нажмите кнопку "Далее".
  • Выберите подключение EntitySplitting в раскрывающемся списке и нажмите кнопку "Далее".
  • В диалоговом окне "Выбор объектов базы данных" установите флажок рядом с узлом таблиц . При этом в модель будут добавлены все таблицы из базы данных EntitySplitting .
  • Нажмите кнопку "Готово".

Отображается конструктор сущностей, предоставляющий графический интерфейс для редактирования модели.

Сопоставьте сущность с двумя таблицами

На этом шаге мы обновим тип сущности Person , чтобы объединить данные из таблиц Person и PersonInfo .

  • Выберите свойства электронной почты и телефона сущности **PersonInfo *** и нажмите клавиши CTRL+X .

  • Выберите сущность **Person** и нажмите клавиши Ctrl+V .

  • В области конструктора выберите сущность PersonInfo и нажмите кнопку "Удалить " на клавиатуре.

  • Нажмите кнопку "Нет" , если вы хотите удалить таблицу PersonInfo из модели, мы готовы сопоставить ее с сущностью Person .

    Удаление таблиц

Для следующих действий требуется окно сведений о сопоставлении . Если вы не видите это окно, щелкните правой кнопкой мыши на поверхности разработки и выберите пункт "Сведения о сопоставлении".

  • Выберите тип сущности Person и нажмите кнопку <"Добавить таблицу или представление>" в окне Детали мэппинга.
  • Выберите **PersonInfo ** в раскрывающемся списке. Окно деталей сопоставления обновлено с использованием сопоставлений столбцов по умолчанию, которые отлично подходят для нашего сценария.

Теперь тип сущности Person сопоставляется с таблицами Person и PersonInfo .

Сопоставление 2

Используйте модель

  • Вставьте следующий код в метод Main.
    using (var context = new EntitySplittingEntities())
    {
        var person = new Person
        {
            FirstName = "John",
            LastName = "Doe",
            Email = "john@example.com",
            Phone = "555-555-5555"
        };

        context.People.Add(person);
        context.SaveChanges();

        foreach (var item in context.People)
        {
            Console.WriteLine(item.FirstName);
        }
    }
  • Скомпилируйте и запустите приложение.

Следующие инструкции T-SQL были выполнены в базе данных в результате выполнения этого приложения. 

  • Следующие две инструкции INSERT были выполнены в результате выполнения контекста. SaveChanges(). Они принимают данные из сущности Person и разделяют их между таблицами Person и PersonInfo .

    Вставка 1

    Вставка 2

  • В результате перечисления людей в базе данных выполняется следующая функция SELECT . Он объединяет данные из таблицы Person и PersonInfo .

    Выбор объединения данных Person и PersonInfo