【问题标题】:How do I create an entity through a RESTful PUT with NHibernate?如何使用 NHibernate 通过 RESTful PUT 创建实体?
【发布时间】:2010-10-23 21:58:22
【问题描述】:

根据 REST 哲学,PUT 操作应该创建一个实体(如果它不存在),或者更新它(如果存在)。因此,例如,如果客户端执行此操作:

PUT http://server/user/5?firstname=John&lastname=Doe

我应该期望创建或更新 ID 为 5 的用户。

update 使用 NHibernate 很容易;只需检索用户并更新名字和姓氏。

但是,如何创建 ID 为 5 的用户?默认情况下,NHibernate 管理所有实体 ID。即使您自己设置了 ID,NHibernate 也会忽略它并用自己的 ID 替换它。如果我切换到使用分配的 ID,那么我可以分配一个 ID 为 5 的新用户,但是我会失去很多 NHibernate 的功能。

也就是说,有没有办法配置 NHibernate 使用生成的 ID(如果未提供),如果提供则使用用户设置的 ID?如果没有,我该如何解决使用 NHibernate 创建 PUT 的问题?

【问题讨论】:

  • 有趣的是,我们对 EntityFramework 有同样的问题(非常关注)。几乎就像您需要以编程方式设置IDENTITY_INSERT 一样。有兴趣看看你是否找到答案。 +1
  • 好问题。只是出于好奇,如果还没有创建用户,那么 5 的 ID 是从哪里来的?您似乎是在说您希望您的用户拥有该 ID,但您还不知道哪些 ID 可用。
  • 这个问题和你之前的问题有什么不同?
  • @Diego:不是,但我想也许以不同的方式再次询问会得到不同的答案。这似乎是应该多次解决的基本问题之一,但我似乎找不到任何答案。每次我问这个问题,我都会得到几个点赞和星星,所以这似乎是其他人关心的问题。

标签: c# nhibernate rest fluent-nhibernate identity


【解决方案1】:

如果你做一个

PUT http://server/user/5

然后服务器创建对象但 nHibernate 更改了 id 然后返回 HTTP 状态代码 301 - Moved permanently 并将新的 URI 放入 Location 标头中。

客户端应检测 301 并使用旧 ID 更新所有存储的 URL。

提醒一句,PUT 语义并不是真正的创建和更新,它们是替换。因此,如果您发送一个只包含姓氏和名字的表示,那么如果您按规定行事,那么之前存储的有关该用户的所有其他信息都会丢失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多