Поделиться через


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

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

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

EF Designer

Необходимые компоненты

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
  • Представление —> Обозреватель сервера
  • Щелкните правой кнопкой мыши данные Подключение ions—> добавьте Подключение ion...
  • Если вы еще не подключились к базе данных из сервера Обозреватель, прежде чем выбрать Microsoft SQL Server в качестве источника данных
  • Подключение в LocalDB или SQL Express в зависимости от установленного экземпляра
  • Введите EntitySplitting в качестве имени базы данных
  • Нажмите кнопку "ОК ", и вам будет предложено создать новую базу данных, нажмите кнопку "Да"
  • Теперь новая база данных появится в сервере Обозреватель
  • Если вы используете Visual Studio 2012
    • Щелкните правой кнопкой мыши базу данных на сервере Обозреватель и выберите "Создать запрос"
    • Скопируйте следующий SQL в новый запрос, а затем щелкните правой кнопкой мыши запрос и выберите "Выполнить".
  • Если вы используете Visual Studio 2010
    • Выбор данных —> редактор 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 .

    Delete Tables

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

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

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

Mapping 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.

    Insert 1

    Insert 2

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

    Select Combining Person and PersonInfo Data