EF Core - 插入然后更新条目

时间:2018-05-05 14:17:26

标签: c# entity-framework-core asp.net-core-webapi

在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:实体类型的实例&#39; DALENTRY&#39;不能   被跟踪,因为另一个具有相同键值的实例   {&#39; ID&#39;}已被跟踪。附加现有实体时,   确保只有一个具有给定键值的实体实例   连接。考虑使用   &#39; DbContextOptionsBuilder.EnableSensitiveDataLogging&#39;看到了   冲突的关键值。   Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap.Add(TKEY的   key,InternalEntityEntry条目)

repo注册为Transient,如:

services.AddTransient<EntryRepository>();

我尝试在插入后使用Detach,但使用它时更新正在清除所有未更新的字段。我无法记住造成这个问题的原因。

1 个答案:

答案 0 :(得分:0)

首先阅读条目,然后更新它,解决了在回购中更改我的更新策略的问题:

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