【发布时间】:2021-12-27 07:16:32
【问题描述】:
我有以下方法更新实体。我唯一的区别是,当提供一个不存在的 ID 时,我得到了一个严重的例外。
public bool Update(Thing thing)
{
Context.Things.Update(thing);
int result = Context.SaveChanges();
return result == 1;
}
所以我添加了一个检查来控制抛出的异常(加上一些不错的日志记录和其他便利)。最终,我打算完全跳过呕吐。
public bool UpdateWithCheck(Thing thing)
{
Thing target = Context.Things.SingleOrDefault(a => a.Id == thing.Id);
if (target == null)
throw new CustomException($"No thing with ID {thing.Id}.");
Context.Things.Update(thing);
int result = Context.SaveChanges();
return result == 1;
}
不,这不起作用,因为实体已经被跟踪。我有几个选择来处理这个问题。
- 更改为
Context.Where(...).AsNoTracking()。 - 在目标中显式设置更新的字段并保存。
- 到处乱搞实体状态并篡改跟踪器。
- 删除当前并添加新的。
我无法决定哪个是最佳做法。谷歌搜索给了我在同一操作中不包含检查预先存在状态的默认示例。
【问题讨论】:
标签: c# entity-framework asp.net-core-5.0