controller.cs 放置函数:
[HttpPut("{id}")]
public async Task<LookupTable> Put(int id, [FromBody] LookupTable lookuptable)
{
var item = await lookupRepository.UpdateLookup(id, lookuptable);
return item;
}
我在存储库层有以下功能:
public async Task<LookupTable> UpdateLookup(int id, LookupTable entity)
{
LookupTable item = await riskDBContext.LookupTables.Where(c => c.LookupId == id).FirstOrDefaultAsync();
item = entity;
var result = await riskDBContext.SaveChangesAsync();
return item;
}
这不会更新。但是,如果我将代码更改为:
public async Task<LookupTable> UpdateLookup(int id, LookupTable entity)
{
LookupTable item = await riskDBContext.LookupTables.Where(c => c.LookupId == id).FirstOrDefaultAsync();
item.LookupAttribute = entity.LookupAttribute;
var result = await riskDBContext.SaveChangesAsync();
return item;
}
它确实在数据库中更新。为什么会这样?我在
LookupTable
有很多房产。所以我想如果我把item = entity
所有旧值都将被替换。
有没有一种方法可以更新所有属性而不是一个一个地分配它们?
您可以更新实体并将实体状态设置为
EntityState.Modified
.
确保为
entity
的主键属性提供数据库表中存在的id值。
public async Task<LookupTable> UpdateLookup(int id, LookupTable entity)
{
riskDBContext.Entry(entity).State = EntityState.Modified;
var result = await riskDBContext.SaveChangesAsync();
return item;
}
参考
您可以使用
Entry
分配属性。也最好在这里使用Find
。
public async Task<LookupTable> UpdateLookup(int id, LookupTable entity)
{
LookupTable item = await riskDBContext.LookupTables.FindAsync(id);
riskDBContext.Entry(item).CurrentValues.SetValues(entity);
var result = await riskDBContext.SaveChangesAsync();
return item;
}
这种方法的缺点是您必须从数据库中检索实体以进行更新,但从另一方面来说,它不会更新表中的所有字段,而只会更新更改。