Обновление диапазона возвращает InvalidOperationException - PullRequest
0 голосов
/ 13 марта 2020

Я хочу обновить диапазон объектов в моем DbContext:

var list = await repository.GetList(ids);
foreach (var entity in list)
{
        entity.IsSomething = true;
}

await repository.UpdateRange(list.ToArray());

...

public async Task UpdateRange(TDomain[] domains)
{
    DbSet.UpdateRange(domains); // exception on this line
    DbContext.SaveChangesAsync(CancellationToken.None)
}

Когда я перехожу на DbSet.UpdateRange(domains) в моем коде, выдается исключение:

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

Я добавил некоторый код в Watch, чтобы проверить, что происходит в моем DbContext.

DbContext.ChangeTracker.Entries().ToList();

В моих записях (до DbSet.UpdateRange(domains); строки) есть две x пустяков с IDs, которые я прошел мимо TDomain[] domains. Эти domains имеют свойство State, установленное на Unchanged.

Мой вопрос: как найти пустые слова, которые DbContext блокирует для редактирования из-за отслеживания? Кажется, что здесь все в порядке, но Entity Framework есть что сказать по-другому.

Настройка x объекта:

var entityTypeBuilder = modelBuilder.Entity<x>();

entityTypeBuilder.HasOne(x => ...).WithOne().HasForeignKey<...>(x => ...);
entityTypeBuilder.HasOne(x => ...).WithOne().HasForeignKey<...>(x => ...);
entityTypeBuilder.HasMany(x => ...).WithOne(x => ...).HasForeignKey(x => ...);
entityTypeBuilder.HasMany(x => ...)
                 .WithOne()
                 .HasForeignKey(x => ...);
entityTypeBuilder.HasMany(x => ...);

Возможно, что-то не так с дочерними элементами, но почему DbContext не отображается в ChangeTracker?

1 Ответ

0 голосов
/ 13 марта 2020

На GetList метод, который я добавил:

AsNoTracking() до ToList() и все стало работать правильно

...