Создание, добавление, изменение и удаление объектов (платформа Entity Framework)

Объекты в контексте объекта — это экземпляры типов сущностей, представляющие данные, которые находятся в источнике данных. Объекты в контексте объекта можно изменять, создавать и удалять, а Entity Framework отслеживает производимые над ними изменения. При вызове метода SaveChanges Entity Framework создает и выполняет команды, которые производят эквивалентные операции вставки, изменения и удаления в хранилище данных. Дополнительные сведения см. в разделе Сохранение изменений и управление параллелизмом (платформа Entity Framework).

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

Платформа Entity Framework позволяет сопоставить операции типа сущности (вставка, обновление и удаление) с хранимыми процедурами. Если планируется сопоставление хранимых процедур со своими сущностями, рекомендуется задать отображения для всех трех операций. Допустим, сопоставление типа сущности задано для хранимых процедур вставки и изменения, но не задано для хранимой процедуры операции удаления. В этом случае операция удаления выдаст ошибку времени выполнения и будет вызвано исключение UpdateException. Дополнительные сведения см. в разделах How to: Map Modification Functions to Stored Procedures и Walkthrough: Mapping an Entity to Stored Procedures.

Создание и добавление объектов

Чтобы вставить данные на источнике данных, создайте экземпляр типа сущности и добавьте объект к контексту объекта. Чтобы сохранить новый объект в источнике данных, сначала необходимо задать все свойства, не поддерживающие значения null. При работе с классами, созданными службами Entity Framework , рассмотрите возможность использования статического метода типа сущности CreateObjectName для создания нового экземпляра типа сущности. Средства модель EDM (сущностная модель данных) при создании типов сущности включают этот метод в каждый класс. Он служит для создания экземпляров объекта и задания всех свойств класса, которые не могут иметь значение null. В этом методе для каждого свойства имеется параметр, атрибут Nullable="false" которого применен в CSDL-файле. Дополнительные сведения см. в разделе Практическое руководство. Создание объекта с помощью статического метода создания (платформа Entity Framework).

При работе с объектами POCO (традиционные объекты среды CLR) сущности используют метод CreateObject для создания нового объекта вместо оператора new. Метод CreateObject создает для нового экземпляра объекта POCO соответствующий прокси-объект. Дополнительные сведения см. в разделе Работа с сущностями POCO (платформа Entity Framework).

Добавление объектов к контексту объекта производится одним из следующих методов.

  • Метод AddObject в объекте ObjectSet.

  • Метод AddObject в объекте ObjectContext.

  • Метод Add в объекте EntityCollection. Для прокси-объектов и сущностей, созданных службами Entity Framework , добавленные сущности присоединяются к контексту вместе с главным объектом. Сущности POCO присоединяются при вызове метода DetectChanges.

При добавлении новых объектов следует принимать во внимание следующие соображения.

  • До вызова метода SaveChanges Entity Framework создает временное значение ключа для каждого нового объекта. После вызова SaveChanges оно заменяется значением идентификатора, назначенного источником данных при вставке новой строки.

  • Если источник данных не создал значение ключа для сущности, то следует назначить уникальное значение вручную. Если пользователь назначил двум объектам одно и то же значение ключа, при вызове метода SaveChanges будет создано исключение InvalidOperationException. Если это случится, нужно присвоить уникальные значения и попытаться повторить операцию.

Удаление объектов

Вызов метода DeleteObject для объекта ObjectSet или метода DeleteObject для объекта ObjectContext помечает указанный объект на удаление. Строка не удаляется из источника данных до тех пор, пока не будет вызван метод SaveChanges. Entity Framework выполняет удаление объектов по-разному, в зависимости от типа отношения, к которому принадлежит объект.

При идентифицирующем отношении, когда первичный ключ главной сущности является частью первичного ключа зависимой сущности, удаление объекта может привести к удалению связанных с ним объектов. Зависимые объекты не могут существовать без заданного отношения с родительским объектом. Удаление родительского объекта приводит к удалению всех дочерних объектов. Это действие выполняется так же, как и при включении атрибута <OnDelete Action="Cascade" /> сопоставления этого отношения.

Для неидентифицирующего отношения, которое представлено сопоставлением на основе внешнего ключа, при удалении главного объекта Entity Framework для зависимых объектов задает для свойств внешнего ключа, допускающих значения null, значение null.

Дополнительные сведения см. в разделах Элемент OnDelete (CSDL) и Определение отношений и управление отношениями (платформа Entity Framework).

Изменение объектов

Entity Framework отслеживает изменения объектов, присоединенных к контексту ObjectContext. Средства модель EDM (сущностная модель данных) создают пару разделяемых методов с именами OnPropertyChanging и OnPropertyChanged. Эти методы вызываются в методах задания свойств. Чтобы реализовать пользовательские процедуры бизнес-логики, которые будут выполняться при изменении свойства, расширьте их в разделяемых классах данных. Дополнительные сведения см. в разделе Как выполнить бизнес-логику при изменении скалярных свойств (платформа Entity Framework). Сведения о работе с сущностями POCO см. в разделе Отслеживание изменений в сущностях POCO (платформа Entity Framework).

При изменении объектов следует учитывать следующие соображения.

  • При изменении любого скалярного или сложного свойства сложного объекта состояние объекта сущности верхнего уровня изменяется на Modified. Если тип POCO не соответствует требованиям для создания прокси, описанным в разделе Требования к созданию прокси-сущностей POCO (платформа Entity Framework), состояние изменяемых свойств изменится на Modified при вызове метода DetectChanges.

  • Если объекты находятся в состоянии Detached, то изменения не отслеживаются. В этом состоянии объекты находятся в том случае, когда они возвращены запросом, использующим параметр слияния NoTracking, а также после отсоединения от контекста ObjectContext вызовом метода Detach.

  • После изменения сопоставления на основе внешнего ключа состояние зависимого объекта изменяется на Modified. После изменения независимого сопоставления состояние зависимого объекта не изменяется.

Дополнительные сведения об отслеживании изменений объектов POCO см. в разделе Отслеживание изменений в сущностях POCO (платформа Entity Framework).

Добавление объектов в конкретный набор EntitySet

В некоторых ситуациях тип сущности принадлежит нескольким наборам сущностей. Например, в базе данных имеются две таблицы с одинаковыми схемами. Это может случиться, если данные были секционированы для повышения эффективности резервного копирования. Допустим, данные заказчика разделены на две таблицы: Customer и CustomerArchive, причем CustomerArchive имеет ту же схему, что и Customer, но в ней хранятся данные заказчиков, не размещавших заказы в течение последних 6 месяцев. Для таблицы Customer можно производить создание резервных копий каждую ночь, в то время как для таблицы CustomerArchive — только раз в неделю. С точки зрения сопоставления таблицы Customer и CustomerArchive должны принадлежать различным наборам сущностей. Платформа Entity Framework поддерживает такой сценарий, позволяя типу сущности существовать в одном или нескольких наборах сущностей. Дополнительные сведения см. в разделе Элемент EntitySet (CSDL).

Если тип сущности существует в нескольких наборах сущностей, то Entity Framework позволяет добавлять новые экземпляры этого типа к определенному набору сущностей. Начиная с .NET Framework версии 4, создаваемый класс ObjectContext для конкретной модели имеет свойства типа ObjectSet, представляющие наборы сущностей модели. Для добавления новых объектов к контексту объекта используется метод AddObject. Дополнительные сведения см. в разделе Работа с ObjectSet (платформа Entity Framework). В .NET Framework версии 3.5 с пакетом обновления 1 (SP1) для добавления объекта к контексту объекта нужно указать значение entitySetName при вызове метода AddObject.

В этом разделе

Как добавлять, изменять и удалять объекты (платформа Entity Framework)

Практическое руководство. Создание объекта с помощью статического метода создания (платформа Entity Framework)

См. также

Задачи

Как определить модель с несколькими наборами сущностей для типа (платформа Entity Framework)
Как добавлять, изменять и удалять объекты (платформа Entity Framework)

Основные понятия

Определение отношений и управление отношениями (платформа Entity Framework)
Работа с сущностями POCO (платформа Entity Framework)
Работа с ObjectSet (платформа Entity Framework)
Работа с ObjectSet (платформа Entity Framework)
Элемент OnDelete (CSDL)