Entity Framework C # SaveChanges вступает в силу не сразу - PullRequest
0 голосов
/ 17 ноября 2018

Почему DBContext.SaveChanges() не вступает в силу немедленно при использовании другого DbContext в том же операторе using?

Например:

public void ChangeStatus(int id)
{
    using(DBContext context = new DBContext())
    {
        var car = context.Cars.FirstOrDefault(x => x.id == id);
        car.status = 1;
        context.SaveChanges();
        UpdateAnotherStatus(id);
    }
}

public void UpdateAnotherStatus(int id)
{
    using(DBContext context = new DBContext())
    {
        var car = context.Cars.FirstOrDefault(x => x.id == id);
        car.status2 = 2;
        context.SaveChanges();
    }
}

1 Ответ

0 голосов
/ 17 ноября 2018

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

public void ChangeStatus(int id){
    using(DBContext firstContext = new DBContext()){
        var firstCar = firstContext .Cars.FirstOrDefault(x=>x.id == id);
        firstCar .status = 1;
        context.SaveChanges();
        UpdateAnotherStatus(id);

        //at this point, the data set in the secondContext
        //did not update `firstCar` because they are completely seperate.
        //to overcome this eighter refetch (slow) or use the firstCar object or firstContext
        //to update status2
    }
}

public void UpdateAnotherStatus(int id){
    using(DBContext secondContext = new DBContext()){
        var secondCar = secondContext .Cars.FirstOrDefault(x=>x.id == id);
        secondCar .status2 = 2;
        secondContext .SaveChanges();
    }
}

В Entity Framework есть средство отслеживания изменений, позволяющее следить за всеми изменениями, внесенными в извлеченные объекты.Этот трекер изменений живет в контексте.Так что в разных контекстах есть разные трекеры изменений, которые (на самом деле) не знают друг друга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...