В методе WebApi мне нужно, если элемент не существует, вставить его и после нескольких операций обновить его.
Код следующий:
Entry existingEntry = await _repo.GetEntryByIdAsync(id);
existingEntry = await _repo.AddNewEntryAsync(existingAccred);
// Some code...
// Update
existingAccred.IdField = myField;
await _repo.UpdateEntryAsync(existingEntry);
Репо выглядит следующим образом:
public async Task<Entry> GetEntryByIdAsync(int myId)
{
var result = from entry in _ctx.Set<DALENTRY>()
where entry.ID == myId
select new Entry
{
ID = entry.IdEntry,
};
return await result.AsNoTracking().FirstOrDefaultAsync();
}
public async Task<Entry> AddNewEntryAsync(Entry newEntry)
{
DALENTRY entry = new DALENTRY()
{
GUID = newEntry.GUID,
};
_ctx.Add(entry);
await _ctx.SaveChangesAsync();
newEntry.IdEntry = entry.ID;
return newEntry;
}
public async Task<Entry> UpdateEntryAsync(Entry updateEntry)
{
DALENTRY entry = new DALENTRY()
{
ID = updateEntry.IdEntry,
FIELD= updateEntry.IdField,
};
_ctx.Update(entry);
await _ctx.SaveChangesAsync();
return updateEntry;
}
Но когда я выполняю обновление, я получаю следующую ошибку:
Произошло необработанное исключение при обработке запроса.
InvalidOperationException: экземпляр типа сущности 'DALENTRY' не может
отслеживаться, потому что другой экземпляр с таким же значением ключа для
{'ID'} уже отслеживается. При присоединении существующих объектов,
убедитесь, что только один экземпляр сущности с данным значением ключа
прилагается. Рассмотреть возможность использования
'DbContextOptionsBuilder.EnableSensitiveDataLogging', чтобы увидеть
конфликтующие ключевые значения.
Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap.Add (TKey
ключ, запись InternalEntityEntry)
Репо зарегистрировано как Transient, как:
services.AddTransient<EntryRepository>();
Я пытался использовать Detach после вставки, но с его помощью обновление очищает все не обновленные поля. Я не могу вспомнить, что является причиной этой проблемы.