【问题标题】:Web API and RavenDB - Check to see if an entity already exists before inserting itWeb API 和 RavenDB - 在插入之前检查实体是否已经存在
【发布时间】: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 的实体。

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

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

你们怎么看?

【问题讨论】:

    标签: c# .net asp.net-mvc ravendb nosql


    【解决方案1】:

    Raven 的 Store 方法类似于 SQL Server 中的 INSERT。没有 UPDATE,您只需从数据库加载对象(将其置于更改跟踪之下),更改它,然后调用 SaveChanges。

    告诉 Raven “这是我通过 HTTP 获得的这个对象,请用这些内容更新这个文档 id”并不是一个好主意,因为那样你将放弃 Raven 的 E-Tags,它可以让你控制并发性。

    根据您的情况,通过 WebAPI 将您的 Raven 模型直接发送到客户端然后直接取回它们可能是也可能不是最好的主意。无论您是使用完全相同的类还是单独的 DTO 类型类与客户端通信,您都可以使用 AutoMapper 将通过 WebAPI 传入的对象的属性映射到您从数据库加载的 RavenDB 模型。

    【讨论】:

    • 是的,我的 GET、PUT 和 POST DTO 往往与模型略有不同。我为“选项2”考虑了Automapper。感谢您的意见大卫 :)
    【解决方案2】:

    尝试使用optimistic concurrency。这样你就可以检测到你是否正在编写一个 id 已经在使用的文档:

    session.Advanced.UseOptimisticConcurrency = true;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 2016-06-24
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多