Сложные типы — конструктор EF

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

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

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

Примечание

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

Что такое сложный тип

Сложные типы — это нескалярные свойства типов сущности, которые позволяют организовать в сущностях скалярные свойства. Подобно сущностям, сложные типы состоят из скалярных свойств или свойств других сложных типов.

При работе с объектами, представляющими сложные типы, учитывайте следующее:

  • Сложные типы не имеют ключей и поэтому не могут существовать независимо друг от друга. Сложные типы могут существовать только как свойства типов сущностей или других сложных типов.
  • Сложные типы не могут участвовать в связях и не могут содержать свойства навигации.
  • Свойства сложного типа не могут иметь значение NULL. Исключение * * InvalidOperationException * * возникает при вызове DbContext. SaveChanges и обнаружении сложного объекта со значением NULL. Скалярные свойства сложных объектов могут иметь значение NULL.
  • Сложные типы не могут наследоваться от других сложных типов.
  • Сложный тип необходимо определить как класс
  • EF обнаруживает изменения элементов в объекте сложного типа при вызове DbContext. DetectChanges . Entity Framework автоматически вызывает DetectChanges при вызове следующих членов: DbSet. Find, DbSet. local, DbSet. Remove, DbSet. Add, DbSet. Attach, DbContext. SaveChanges, DbContext. жетвалидатионеррорс, DbContext. Entry, дбчанжетраккер.ALL.

Рефакторинг свойств сущности в новый сложный тип

Если у вас уже есть сущность в концептуальной модели, может потребоваться рефакторинг некоторых свойств в свойство сложного типа.

В области конструктора выберите одно или несколько свойств (за исключением свойств навигации) сущности, щелкните правой кнопкой мыши и выберите Рефакторинг — переместить в новый сложный тип.

Рефакторинг для создания сложного типа

Новый сложный тип с выбранными свойствами добавляется в Обозреватель моделей. Сложному типу присваивается имя по умолчанию.

Сложное свойство только что созданного типа заменит выбранные свойства. Все сопоставления свойств будут сохранены.

Рефакторинг для нового сложного типа 2

Создание нового сложного типа

Можно также создать новый сложный тип, который не содержит свойств существующей сущности.

Щелкните правой кнопкой мыши папку Составные типы в обозревателе моделей и выберите команду AddNew сложный тип.... Кроме того, можно выбрать папку сложных типов и нажать клавишу INSERT на клавиатуре.

Добавить новый сложный тип

Новый сложный тип будет добавлен в папку с именем по умолчанию. Теперь в тип можно добавлять свойства.

Добавление свойств в сложный тип

Свойства сложного типа могут иметь как скалярные, так и существующие сложные типы. Однако свойства сложного типа не могут иметь циклических ссылок. Например, сложный тип онситекаурседетаилс не может иметь свойство сложного типа онситекаурседетаилс.

Добавить свойство к сложному типу можно любым из следующих способов.

  • В обозревателе моделей щелкните правой кнопкой мыши сложный тип, наведите указатель на пункт Добавить, укажите скалярное свойство или сложное свойство, а затем выберите нужный тип свойства. Кроме того, можно выбрать сложный тип и нажать клавишу INSERT на клавиатуре.

    Добавить свойства в сложный тип

    Новое свойство будет добавлено к сложному типу с именем по умолчанию.

  • OR -

  • Щелкните правой кнопкой мыши свойство сущности в области конструктора EF и выберите Копировать, затем щелкните правой кнопкой мыши сложный тип в обозревателе моделей и выберите команду Вставить.

Переименование сложного типа

При переименовании сложного типа все ссылки на тип обновляются по всему проекту.

  • Медленно дважды щелкните сложный тип в обозревателе моделей. Имя будет выбрано в режиме редактирования.

  • OR -

  • Щелкните правой кнопкой мыши сложный тип в обозревателе моделей и выберите команду Переименовать.

  • OR -

  • Выберите сложный тип в браузере моделей и нажмите клавишу F2.

  • OR -

  • Щелкните правой кнопкой мыши сложный тип в обозревателе моделей и выберите пункт свойства. Измените имя в окне Свойства .

Добавьте существующий сложный тип в сущность и сопоставьте его свойства со столбцами таблицы.

  1. Щелкните сущность правой кнопкой мыши, наведите указатель на пункт Добавить новыйи выберите пункт сложное свойство. Свойство сложного типа с именем по умолчанию будет добавлено к сущности. Свойству назначается тип по умолчанию (выбранный из имеющихся сложных типов).

  2. Назначьте требуемый тип свойству в окне Свойства . После добавления свойства сложного типа к сущности необходимо сопоставить ее свойства со столбцами таблицы.

  3. Щелкните правой кнопкой мыши тип сущности в области конструктора или в обозревателе моделей и выберите сопоставления таблиц. Сопоставления таблиц отображаются в окне сведения о сопоставлении .

  4. разверните узел Карты имя > таблицы . Появится узел сопоставления столбцов .

  5. Разверните узел сопоставления столбцов . Появится список всех столбцов таблицы. Свойства по умолчанию (если таковые имеются), к которым соответствует таблица Columns, перечислены под заголовком значение/свойство .

  6. Выберите столбец, который необходимо соотнести, и щелкните правой кнопкой мыши соответствующее поле значения или свойства . Отобразится раскрывающийся список всех скалярных свойств.

  7. Выберите соответствующее свойство.

    Составной тип Map

  8. Повторите шаги 6 и 7 для каждого столбца таблицы.

Примечание

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

Преобразование импорта функции в сложный тип

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

  • Дважды щелкните импортированную функцию, которая должна быть сопоставлена с сложным типом.

    Импорты функций

  • Задайте параметры для нового импорта функции следующим образом.

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

    • Укажите имя импорта функции в поле имя импорта функции .

    • Выберите сложный тип возвращаемого значения, а затем укажите конкретный сложный тип возвращаемого значения, выбрав соответствующий тип из раскрывающегося списка.

      Изменить импорт функции

  • Нажмите кнопку ОК. В концептуальной модели создается запись импорта функции.

Настройка сопоставления столбцов для импорта функции

  • Щелкните правой кнопкой мыши импорт функции в обозревателе моделей и выберите Сопоставление импорта функций. Появится окно сведения о сопоставлении , в котором будет показано сопоставление по умолчанию для импорта функции. Стрелки указывают сопоставления между значениями столбцов и значениями свойств. По умолчанию предполагается, что имена столбцов совпадают с именами свойств сложного типа. Имена столбцов по умолчанию отображаются серым текстом.
  • Если необходимо, измените имена столбцов таким образом, чтобы они совпадали с именами столбцов, возвращаемых хранимой процедурой, соответствующей импорту функции.

Удаление сложного типа

При удалении сложного типа он удаляется из концептуальной модели. Кроме того, удаляются сопоставления для всех экземпляров типа. Однако ссылки на тип не обновляются. Например, если сущность имеет свойство сложного типа типа ComplexType1 и ComplexType1 удаляется в обозревателе моделей, соответствующее свойство сущности не обновляется. Модель не пройдет проверку, поскольку содержит сущность, которая ссылается на удаленный сложный тип. Обновить или удалить ссылки на удаленные сложные типы можно с помощью конструктора сущностей.

  • Щелкните в обозревателе моделей правой кнопкой мыши сложный тип и выберите пункт Удалить.

  • OR -

  • В браузере моделей выберите сложный тип и нажмите на клавиатуре клавишу DELETE.

Запрос сущностей, содержащих свойства сложного типа

В следующем коде показано, как выполнить запрос, возвращающий коллекцию объектов типа сущности, содержащих свойство сложного типа.

    using (SchoolEntities context = new SchoolEntities())
    {
        var courses =
            from c in context.OnsiteCourses
            order by c.Details.Time
            select c;

        foreach (var c in courses)
        {
            Console.WriteLine("Time: " + c.Details.Time);
            Console.WriteLine("Days: " + c.Details.Days);
            Console.WriteLine("Location: " + c.Details.Location);
        }
    }