Ненадлежащее состояние входа после Attach - PullRequest
0 голосов
/ 07 февраля 2020

Я играю над Add / Attach и борюсь с чем-то.

Если в последних строках моего примера (в случае 2) я получаю ссылку на Entry (entry4) моей сущности состояние в каждом экземпляре записи изменяется. Но если нет записи4 (в случае 1), состояние в каждой записи не изменяется.

var book = new Book
{
    BookId = 3,
    AuthorName = "Andrzej Sapkowski"
};
var entry1 = context.Entry(book); 
// -> entry1.State equals to Detached
var entry2 = context.Attach(book);
// -> entry1.State, entry2.State equal to Unchanged
var entry3 = context.Entry(book); 
// -> entry1.State, entry2.State, entry3.State equal to Unchanged
book.Title = "The witcher 1";

СЛУЧАЙ 1 (строка закомментирована)

// var entry4 = context.Entry(book); 
// -> NOTHING changed: entry1.State, entry2.State, entry3.State equal to Unchanged

Случай 2 (строка НЕ ​​комментируется)

var entry4 = context.Entry(book); 
// -> EVERYTHING changed: entry1.State, entry2.State, entry3.State equal to Modified

Также

entry1!=entry2!=entry3!=entry4

Версии : . Net Core 3.1 , Microsoft.EntityFrameworkCore.SqlServer 3.1.1

Поэтому я не понимаю, как получение ссылки может изменить состояние. Даже если это ошибка, это очень, очень странная ошибка. Что-то изменилось через геттер.

Большое спасибо!

1 Ответ

1 голос
/ 07 февраля 2020

Состояние существующих объектов EntityEntry не изменяется до тех пор, пока для объекта не будет запущено отслеживание изменений. Book - это POCO, поэтому у отслеживателя изменений нет волшебного c способа узнать, что вы изменили название.

Получение нового EntityEntry для книги обнаруживает изменение и делает его видимым для всех остальных EntityEntrys. Или работает:

book.Title = "The witcher 1";
context.ChangeTracker.DetectChanges();

Обновит существующие объекты EntityEntry с правильным состоянием.

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