Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе показано, как сопоставить сложные типы с конструктором Entity Framework (EF Designer) и как запрашивать сущности, содержащие свойства сложного типа.
На следующем рисунке показаны основные окна, которые используются при работе с конструктором 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.GetValidationErrors, DbContext.Entry, DbChangeTracker.Entries.
Рефакторинг свойств сущности в новый сложный тип
Если у вас уже есть сущность в концептуальной модели, может потребоваться рефакторинг некоторых свойств в свойство сложного типа.
В области конструктора выберите одно или несколько свойств (за исключением свойств навигации) сущности, а затем щелкните правой кнопкой мыши и выберите Рефакторинг: Переместить в новый сложный тип.
В браузер модели добавляется новый сложный тип с выбранными свойствами. Сложный тип имеет имя по умолчанию.
Комплексное свойство только что созданного типа заменяет выбранные свойства. Все сопоставления свойств сохраняются.
Создание нового сложного типа
Можно также создать новый сложный тип, который не содержит свойств существующей сущности.
Щелкните правой кнопкой мыши папку "Сложные типы " в браузере моделей, наведите указатель на добавление сложного типа.... Кроме того, можно выбрать папку "Сложные типы " и нажать клавишу INSERT на клавиатуре.
Новый сложный тип добавляется в папку с именем по умолчанию. Теперь можно добавить свойства в тип.
Добавление свойств в сложный тип
Свойства сложного типа могут быть скалярными типами или существующими сложными типами. Однако свойства сложного типа не могут иметь циклические ссылки. Например, сложный тип OnsiteCourseDetails не может иметь свойство сложного типа OnsiteCourseDetails.
Свойство можно добавить в сложный тип любым из перечисленных ниже способов.
Щелкните правой кнопкой мыши сложный тип в браузере модели, наведите указатель на "Добавить", а затем наведите указатель на скалярное свойство или сложное свойство, а затем выберите нужный тип свойства. Кроме того, можно выбрать сложный тип и нажать клавишу INSERT на клавиатуре.
Новое свойство добавляется в сложный тип с именем по умолчанию.
ИЛИ-
Щелкните правой кнопкой мыши свойство сущности в области EF Designer и выберите " Копировать", а затем щелкните правой кнопкой мыши сложный тип в браузере модели и выберите "Вставить".
Переименование сложного типа
При переименовании сложного типа все ссылки на тип обновляются во всем проекте.
Медленно дважды щелкните сложный тип в браузере моделей. Имя будет выбрано и перейдет в режим редактирования.
ИЛИ-
Щелкните правой кнопкой мыши сложный тип в браузере модели и выберите "Переименовать".
ИЛИ-
Выберите сложный тип в браузере модели и нажмите клавишу F2.
ИЛИ-
Щелкните правой кнопкой мыши сложный тип в браузере модели и выберите "Свойства". Измените имя в окне "Свойства ".
Добавление существующего сложного типа в сущность и сопоставление свойств с столбцами таблицы
Щелкните правой кнопкой мыши сущность, наведите указатель на добавление нового и выберите "Сложное свойство". Свойство сложного типа с именем по умолчанию добавляется в сущность. Тип по умолчанию (выбранный из существующих сложных типов) назначается свойству.
Назначьте нужный тип свойству в окне свойств . После добавления свойства сложного типа в сущность необходимо сопоставить его свойства со столбцами таблицы.
Щелкните правой кнопкой мыши тип сущности в области конструктора или в браузере моделей и выберите сопоставления таблиц. Сопоставления таблиц отображаются в окне сведений о сопоставлении .
Разверните узел Карты в <Имя Таблицы>. Появится узел сопоставления столбцов .
Разверните узел сопоставления столбцов. Появится список всех столбцов в таблице. Свойства по умолчанию (если таковые имеются), с которыми сопоставляются столбцы, перечислены в заголовке Value/Property .
Выберите столбец, который нужно сопоставить, и щелкните правой кнопкой мыши соответствующее поле "Значение/свойство ". Отображается раскрывающийся список всех скалярных свойств.
Выберите соответствующее свойство.
Повторите шаги 6 и 7 для каждого столбца таблицы.
Замечание
Чтобы удалить сопоставление столбцов, выберите столбец, который требуется сопоставить, и щелкните поле "Значение/свойство ". Затем выберите "Удалить " из раскрывающегося списка.
Сопоставление импорта функции со сложным типом
Импорт функций основан на хранимых процедурах. Чтобы сопоставить импорт функции с сложным типом, столбцы, возвращаемые соответствующей хранимой процедурой, должны соответствовать свойствам сложного типа в количестве и иметь типы хранилища, совместимые с типами свойств.
Дважды щелкните импортированную функцию, которую необходимо сопоставить с сложным типом.
Введите параметры для импорта новой функции следующим образом:
Укажите хранимую процедуру, для которой создается импорт функции в поле "Имя хранимой процедуры ". Это поле представляет собой раскрывающийся список, в котором отображаются все хранимые процедуры в модели хранения.
Укажите имя импорта функции в поле "Имя импорта функции".
Выберите "Сложный " в качестве возвращаемого типа, а затем укажите конкретный сложный тип возвращаемого значения, выбрав соответствующий тип из раскрывающегося списка.
Нажмите кнопку ОК. Запись импорта функций создается в концептуальной модели.
Настройка сопоставления столбцов для импорта функций
- Щелкните правой кнопкой мыши импорт функции в браузере модели и выберите "Сопоставление импорта функций". Появится окно сведений о сопоставлении, отображающее сопоставление по умолчанию для импорта функции. Стрелки указывают на сопоставления между значениями столбцов и значениями свойств. По умолчанию предполагается, что имена столбцов совпадают с именами свойств сложного типа. Имена столбцов по умолчанию отображаются в сером тексте.
- При необходимости измените имена столбцов в соответствии с именами столбцов, возвращаемыми хранимой процедурой, соответствующей импорту функции.
Удалите сложный тип
При удалении сложного типа тип удаляется из концептуальной модели, а сопоставления для всех экземпляров типа удаляются. Однако ссылки на тип не обновляются. Например, если в браузере модели удаляется сложное свойство типа ComplexType1, то соответствующее свойство сущности не обновляется. Модель не проверяется, так как она содержит сущность, которая ссылается на удаленный сложный тип. Можно обновить или удалить ссылки на удаленные сложные типы с помощью конструктора сущностей.
Щелкните правой кнопкой мыши сложный тип в обозревателе модели и выберите Удалить.
ИЛИ-
Выберите сложный тип в браузере модели и нажмите клавишу 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);
}
}