Есть еще несколько сценариев для Detached Object
.
1.Вы не хотите отслеживать сущность.
var entity= context.MyEntities.AsNoTracking().Where(...).FirsOrDefault();
В этом запросе извлеченные сущности не отслеживаются, поэтому любые изменения всущности не будут записаны в базу данных.
Учтите это.
entity.Name = "1";
context.SaveChanges();
Поскольку эти сущности не отслеживаются, изменения не будут сохранены, пока вы не прикрепите их.
var entry = _context.Entry<T>(entity);
if (entry.State == EntityState.Detached)
{
_context.Set<T>().Attach(entity);
entry.State = EntityState.Modified;
}
2. Проанализируйте вашу работу над автономной архитектурой (API, Web).Рассмотрим API сотрудника с конечной точкой PUT.
Это позволит привязать сотрудника к контексту и обновить сущность, поскольку контекст не знает об этой сущности.
Преимущество: нет необходимости извлекать сущность сотрудника из базы данных.
Недостаток: другой пользователь изменяет сущность между транзакциями, может быть потеряно (вы все равно можете обновить только измененное свойство)
public void UpdateEmployee(Employee entity)
{
var entry = _context.Entry<Employee>(entity);
if (entry.State == EntityState.Detached)
{
_context.Attach(entity);
entry.State = EntityState.Modified;
}
Context.SaveChanges()
}
Вторая версия
public void UpdateEmployee(Employee entity)
{
var dbItem = context.EmployeeEnities.FirstOrDefault(g=>g.Id==entity.Id);
//Context is already have track of this entity, you can just update properties you have changed.
dbItem.Name = entity.Name;
Context.SaveChanges()
}