Срок действия и область отслеживания контекста EF Core DB - PullRequest
0 голосов
/ 03 января 2019

Я столкнулся с некоторым поведением в ASP.NET Core 2.2 и EF, которое я не уверен, предназначено ли оно и особенно, если это безопасно.

Дать следующий код:

{ 
    //...

    if (condition)
    {
        var result = await MyDbContext.MyTable
            .Where(data => data.Id == id)
            .FirstOrDefaultAsync();

        result.MyColumn -= 42;
    }

    //...more MyDbContext operations        

    await MyDbContext.SaveChangesAsync();

    //...
}

EF Core успешно запрашивает базу данных и соответствующим образом обновляет поле MyColumn (в данном случае вычитая 42), даже если объявление переменной result и операция вычитания выполнялись в отдельном блоке (и неявно в области видимости).

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

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Это предполагаемое поведение. Все внесенные изменения сохраняются на уровне DbContext.

Итак, когда вы делаете result.MyColumn -= 42;, вы фактически обновляете базовый объект DbContext, который отслеживает все изменения и знает, требуется ли обновление БД

0 голосов
/ 03 января 2019

Отслеживание изменений осуществляется на уровне DbContext, поэтому, если его одинаковый контекст используется внутри различных областей, что в вашем случае кажется, то это намеченное и надежное поведение yes.

...