在我需要的 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 条目)
该 repo 注册为 Transient,如:
services.AddTransient<EntryRepository>();
我尝试在插入后使用分离,但使用它更新会清除所有未更新的字段。我不记得是什么导致了这个问题。
通过首先阅读条目解决了在 repo 中更改我的更新策略,然后更新它:
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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句