EF Core - вставьте и обновите запись - PullRequest
0 голосов
/ 05 мая 2018

В методе 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 после вставки, но с его помощью обновление очищает все не обновленные поля. Я не могу вспомнить, что является причиной этой проблемы.

1 Ответ

0 голосов
/ 07 мая 2018

Решено изменить мою стратегию обновления в репо, сначала прочитав запись, а затем обновив ее:

public async Task<Entry> UpdateEntryAsync(Entry updateEntry)
{
    DALENTRY entry = await _ctx.Set<DALENTRY >().SingleOrDefaultAsync(a => a.ID == updateEntry.IdEntry);

    entry.FIELD= updateEntry.IdField,

    _ctx.Update(entry);
    await _ctx.SaveChangesAsync();

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