【发布时间】:2014-04-17 00:51:49
【问题描述】:
我有一个 PUT API 端点,我想在更新和存储之前检查具有指定 ID 的记录是否已经存在。
来自 EntityFramework/SQLServer 世界,我发现尝试更新不存在的记录会简单地使用提供的错误 ID 创建一个新文档而不是引发异常,这很奇怪。
这是我的控制器端点代码和我的 repo 方法:
public Models.Widget Put(Models.Widget entity)
{
using (_unitOfWork)
{
var originalWidget = _widgetRepository.Get(entity.Id);
if(null == originalWidget)
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, string.Format("Widget with id of {0} could not be found.", entity.Id)));
_widgetRepository.Store(entity);
_unitOfWork.SaveChanges();
return entity;
}
}
回购方法:
public Widget Get(long id)
{
var widget = Session.Load<Widget>("widgets/"+id);
return widget;
}
public void Store(Widget model)
{
Session.Store(model);
}
假设我们通过了控制器中的 null 检查,我得到的错误如下:
Message: "An error has occurred."
ExceptionMessage: "Attempted to associate a different object with id 'Widgets/33'."
我知道为什么我得到了错误,我最终“跟踪”了 2 个具有相同 ID 的实体。
我有两个可能的解决方案,希望得到您的反馈。
- 找到一种有效的方法来通过 ID 检查是否存在,而不会加载原始文件进行跟踪。
- 获取原始文件并将它们与传入的 PUT DTO 一起“修补”并将其存储回数据库中。
你们怎么看?
【问题讨论】:
标签: c# .net asp.net-mvc ravendb nosql