繁体   English   中英

EF Core-插入然后更新条目

[英]EF Core - Insert then update an entry

在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,但是使用它更新会清除所有未更新的字段。 我不记得是什么引起了这个问题。

通过先阅读条目,然后更新它,解决了在仓库中更改我的更新策略的问题:

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM