C# Web API和RavenDB-在插入实体之前,检查实体是否已存在
我有一个PUT API端点,我想在更新和存储之前检查具有指定ID的记录是否已经存在 我来自EntityFramework/SQLServer世界,我发现尝试更新一个不存在的记录只会创建一个具有错误ID的新文档,而不会引发异常,这很奇怪 以下是我的控制器端点和repo方法的代码:C# Web API和RavenDB-在插入实体之前,检查实体是否已存在,c#,.net,asp.net-mvc,ravendb,nosql,C#,.net,Asp.net Mvc,Ravendb,Nosql,我有一个PUT API端点,我想在更新和存储之前检查具有指定ID的记录是否已经存在 我来自EntityFramework/SQLServer世界,我发现尝试更新一个不存在的记录只会创建一个具有错误ID的新文档,而不会引发异常,这很奇怪 以下是我的控制器端点和repo方法的代码: public Models.Widget Put(Models.Widget entity) { using (_unitOfWork) { var or
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);
}
回购方式:
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);
}
我知道为什么会出错,我最终“跟踪”了两个具有相同id的实体
我有两个可能的解决方案,希望您的反馈
你们觉得怎么样 Raven的存储方法类似于SQL Server中的INSERT。没有更新,您只需从数据库加载对象(将其置于更改跟踪之下),对其进行更改,然后调用SaveChanges 告诉Raven“这是我通过HTTP获得的对象,请用这些内容更新此文档id”,这不是一个好主意,因为这样您就放弃了Raven的电子标签,它可以控制并发性
根据您的情况,通过WebAPI将您的Raven模型直接发送给客户,然后直接取回可能是最好的方法,也可能不是最好的方法。无论是否使用完全相同的类或单独的DTO类型类与客户端通信,都可以使用AutoMapper将通过WebAPI传入的对象的属性映射到从数据库加载的RavenDB模型。Raven的存储方法类似于在SQL Server中插入。没有更新,您只需从数据库加载对象(将其置于更改跟踪之下),对其进行更改,然后调用SaveChanges 告诉Raven“这是我通过HTTP获得的对象,请用这些内容更新此文档id”,这不是一个好主意,因为这样您就放弃了Raven的电子标签,它可以控制并发性
根据您的情况,通过WebAPI将您的Raven模型直接发送给客户,然后直接取回可能是最好的方法,也可能不是最好的方法。无论是否使用完全相同的类或单独的DTO类型类与客户端通信,都可以使用AutoMapper将通过WebAPI传入的对象的属性映射到从数据库加载的RavenDB模型。Raven的存储方法类似于在SQL Server中插入。没有更新,您只需从数据库加载对象(将其置于更改跟踪之下),对其进行更改,然后调用SaveChanges 告诉Raven“这是我通过HTTP获得的对象,请用这些内容更新此文档id”,这不是一个好主意,因为这样您就放弃了Raven的电子标签,它可以控制并发性
根据您的情况,通过WebAPI将您的Raven模型直接发送给客户,然后直接取回可能是最好的方法,也可能不是最好的方法。无论是否使用完全相同的类或单独的DTO类型类与客户端通信,都可以使用AutoMapper将通过WebAPI传入的对象的属性映射到从数据库加载的RavenDB模型。Raven的存储方法类似于在SQL Server中插入。没有更新,您只需从数据库加载对象(将其置于更改跟踪之下),对其进行更改,然后调用SaveChanges 告诉Raven“这是我通过HTTP获得的对象,请用这些内容更新此文档id”,这不是一个好主意,因为这样您就放弃了Raven的电子标签,它可以控制并发性 根据您的情况,通过WebAPI将您的Raven模型直接发送给客户,然后直接取回可能是最好的方法,也可能不是最好的方法。无论是否使用完全相同的类或单独的DTO类型类与客户端通信,都可以使用AutoMapper将通过WebAPI传入的对象的属性映射到从数据库加载的RavenDB模型。尝试使用。通过这种方式,您可以检测是否正在使用已在使用的id编写文档:
session.Advanced.UseOptimisticConcurrency = true;
尝试使用。通过这种方式,您可以检测是否正在使用已在使用的id编写文档:
session.Advanced.UseOptimisticConcurrency = true;
尝试使用。通过这种方式,您可以检测是否正在使用已在使用的id编写文档:
session.Advanced.UseOptimisticConcurrency = true;
尝试使用。通过这种方式,您可以检测是否正在使用已在使用的id编写文档:
session.Advanced.UseOptimisticConcurrency = true;
是的,我的GET、PUT和POST DTO往往与模型略有不同。我已经考虑过Automapper的“选项2”。谢谢你的输入David:)是的,我的GET、PUT和POST DTO往往与模型略有不同。我已经考虑过Automapper的“选项2”。谢谢你的输入David:)是的,我的GET、PUT和POST DTO往往与模型略有不同。我已经考虑过Automapper的“选项2”。谢谢你的输入David:)是的,我的GET、PUT和POST DTO往往与模型略有不同。我已经考虑过Automapper的“选项2”。谢谢你的意见大卫:)