我知道这个问题已经被问过了,但是那个解决方案对我没有帮助。
[Fact]
public async Task UpdateAsync()
{
string newTitle = "newTitle1";
int newBrandId = 3;
var item = await storeContext.Items.AsNoTracking().FirstOrDefaultAsync();
item.BrandId = newBrandId;
item.Title = newTitle;
storeContext.Entry(item).State = EntityState.Detached;
await service.UpdateAsync(item); // exception inside
var updatedItem = await storeContext.Items.AsNoTracking().FirstOrDefaultAsync();
Assert.Equal(newTitle, updatedItem.Title);
Assert.Equal(newBrandId, updatedItem.BrandId);
}
public async Task UpdateAsync(T entity)
{
_dbContext.Entry(entity).State = EntityState.Modified; // exception when trying to change the state
await _dbContext.SaveChangesAsync();
}
错误信息:System.InvalidOperationException:无法跟踪实体类型“Item”的实例,因为已经跟踪了具有相同键值对 {'Id'} 的另一个实例。在附加现有实体时,请确保只附加具有给定键值的一个实体实例。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”以查看冲突的键值。
有趣的是,即使没有从数据库中检索到任何项目,异常仍然是相同的,如下所示:
//var item = await storeContext.Items.AsNoTracking().FirstOrDefaultAsync();
var item = new Item()
{
Id = 1,
BrandId = newBrandId,
CategoryId = 1,
MeasurementUnitId = 1,
StoreId = 1,
Title = newTitle
};
storeContext.Entry(item).State = EntityState.Detached;
,然后像您在问题末尾所做的那样手动创建项目。 - Tomas ChabadastoreContext
中使用的DbContext
实例与您的服务service
中使用的实例相同。 - CodeNotFound