Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web API和RavenDB-在插入实体之前,检查实体是否已存在_C#_.net_Asp.net Mvc_Ravendb_Nosql - Fatal编程技术网

C# Web API和RavenDB-在插入实体之前,检查实体是否已存在

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

我有一个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);
    }
回购方式:

 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的实体

我有两个可能的解决方案,希望您的反馈

  • 找到一种有效的方法,通过ID检查是否存在,而不加载原始文件进行跟踪
  • 获取原始数据并将其与传入的PUT DTO一起“修补”,然后将其存储回数据库

  • 你们觉得怎么样

    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”。谢谢你的意见大卫:)