Вставка ядра структуры сущности без отслеживания изменений - PullRequest
0 голосов
/ 11 октября 2019

У меня есть большая кодовая база, и, к сожалению, я не могу воспроизвести ее на небольшом примере кода, но я вроде как делаю это:

    db.Persons.Add(new Person() {Name = "Foo"});
    await db.SaveChangesAsync()
    await db.Persons.FromSql("truncate table Persons;select top 0 * from Persons").ToListAsync();
    db.Persons.Add(new Person() {Name = "Bar"});
    await db.SaveChangesAsync()

И в конечном итоге с этой ошибкой на последних изменениях сохранения:

System.InvalidOperationException: экземпляр типа сущности 'InstructionLineAllocationDto' не может быть отслежен, поскольку другой экземпляр с таким же значением ключа для {'Id'} уже отслеживается.

ЯПомните, что усечение немного нестандартно. Поле Id, содержащееся в ошибке, является полем Identity в базе данных, которое меня не особо волнует.

Я не могу найти места, объясняющие, как реализовать промежуточные таблицы, где вы часто усекаете и вставляете связку иэтот код также не был бы проблемой, если он запускался один раз за tuncate. (Но это слушатель, который всегда активен)

Так что все ответы, которые запускаются постоянно и иногда вставляют много и усекаются, но всегда активны, интересны.

Но мой самый конкретный вопрос:как я могу это сделать без какого-либо отслеживания изменений

Код - EntityFrameworkCore SqlServer 2.0.0

1 Ответ

0 голосов
/ 14 октября 2019

Я точно не уверен, что происходит, но похоже, что идентификатор поддерживается с помощью некоторого цикла минус-числа. Как писал Pac0, решение - отстраниться. Так что мой код оказался в DbContext

    var changedEntriesCopy = _dbEntities.ChangeTracker.Entries()
        .Where(e => e.State == EntityState.Added ||
                    e.State == EntityState.Modified ||
                    e.State == EntityState.Deleted)
        .ToList();

    await _dbEntities.SaveChangesAsync();

    foreach (var entry in changedEntriesCopy)
        entry.State = EntityState.Detached;

. Странная часть заключается в том, что SaveChangesAsync ofcourse также выполняет detatch, changeEntriesCopy состоит из 0 записей, если код запускается после Save. Но с помощью этого кода проблема решена.

Существует какая-то магия Entity Framework, которую я не понимаю.

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