Когда сущность отсоединяется в Entity Framework? - PullRequest
0 голосов
/ 03 июня 2018

Я видел во многих сообщениях, что если отслеживание не включено, сущность отсоединяется.

Я хотел бы знать следующее: как может быть несколько объектов, которые не отслеживаются, и несколько объектов, которые не могут быть отслежены?отслеживаются?

Может ли кто-нибудь поделиться фрагментом кода, который показывает, что этот объект не отслеживается контекстом.

Согласно MSDN :

Отдельно: сущность не отслеживается контекстом https://msdn.microsoft.com/en-us/library/jj592676(v=vs.113).aspx

Согласно следующему посту, который я прочитал: http://blog.maskalik.com/entity-framework/2013/12/23/entity-framework-updating-database-from-detached-objects/

var entry = _context.Entry<T>(entity);

if (entry.State == EntityState.Detached)
{
    _context.Set<T>().Attach(entity);
    entry.State = EntityState.Modified;
}

Отдельные объекты или объекты, созданные вне EntityВ Framework (EF) автоматическое отслеживание не включено.

И создание класса POCO в подходе с первым кодом - один из таких примеров отдельного объекта.

Это единственный сценарий?

1 Ответ

0 голосов
/ 03 июня 2018

Есть еще несколько сценариев для 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()
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...