EF Core-插入然后更新条目

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


跃然一笑
浏览 324回答 1
1回答

红颜莎娜

通过先阅读条目,然后对其进行更新,解决了在仓库中更改我的更新策略的问题:public async Task<Entry> UpdateEntryAsync(Entry updateEntry){&nbsp; &nbsp; DALENTRY entry = await _ctx.Set<DALENTRY >().SingleOrDefaultAsync(a => a.ID == updateEntry.IdEntry);&nbsp; &nbsp; entry.FIELD= updateEntry.IdField,&nbsp; &nbsp; _ctx.Update(entry);&nbsp; &nbsp; await _ctx.SaveChangesAsync();&nbsp; &nbsp; return updateEntry;}
打开App,查看更多内容
随时随地看视频慕课网APP