Entity Framework
Состояние управляющего объекта
Поиск…
замечания
Объекты в Entity Framework могут иметь различные состояния, которые перечислены в перечислении System.Data.Entity.EntityState . Этими состояниями являются:
Added
Deleted
Detached
Modified
Unchanged
Entity Framework работает с POCOs. Это означает, что объекты - это простые классы, которые не имеют свойств и методов для управления своим собственным состоянием. Состояние ObjectStateManager
управляется самим контекстом в ObjectStateManager
.
В этом разделе рассматриваются различные способы установки состояния объекта.
Состояние установки Добавлен один объект
EntityState.Added
может быть установлен двумя полностью эквивалентными способами:
Установив состояние его записи в контексте:
context.Entry(entity).State = EntityState.Added;
Добавив его в
DbSet
контекста:context.Entities.Add(entity);
При вызове SaveChanges
объект будет вставлен в базу данных. Когда у него есть столбец идентификатора (автоматически заданный, автоматически увеличивающий первичный ключ), то после SaveChanges
свойство первичного ключа объекта будет содержать вновь сгенерированное значение, даже если это свойство уже имеет значение .
Состояние установки Добавлен граф объекта
Установка состояния графа объекта (набора связанных объектов) в Added
отличается от установки отдельного объекта как Added
(см. Этот пример ).
В этом примере мы храним планеты и их луны:
Модель класса
public class Planet
{
public Planet()
{
Moons = new HashSet<Moon>();
}
public int ID { get; set; }
public string Name { get; set; }
public ICollection<Moon> Moons { get; set; }
}
public class Moon
{
public int ID { get; set; }
public int PlanetID { get; set; }
public string Name { get; set; }
}
контекст
public class PlanetDb : DbContext
{
public property DbSet<Planet> Planets { get; set; }
}
Мы используем экземпляр этого контекста для добавления планет и их спутников:
пример
var mars = new Planet { Name = "Mars" };
mars.Moons.Add(new Moon { Name = "Phobos" });
mars.Moons.Add(new Moon { Name = "Deimos" });
context.Planets.Add(mars);
Console.WriteLine(context.Entry(mars).State);
Console.WriteLine(context.Entry(mars.Moons.First()).State);
Выход:
Added
Added
Мы видим здесь, что добавление Planet
также добавляет состояние луны в Added
.
При настройке состояния объекта на Added
все объекты в своих свойствах навигации (свойства, которые «перемещаются» по отношению к другим объектам, например Planet.Moons
) также помечены как Added
, если они уже не привязаны к контексту .