- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 OData V4.0 API,我正在努力思考如何正确创建实体。我正在使用这个 OData V4.0 reference service .
我的“天真”假设(基于大多数数据库的工作方式)是,当将实体发布到集合时,我会省略主键并让服务生成它并在响应中将其返回给我。
换句话说,当我发出以下请求时:
POST http://services.odata.org/Experimental/OData/(S(<SessionID>))/OData.svc/Products
Content-Type: application/json
{
"@odata.type": "ODataDemo.Product",
"Name": "Widget",
"Description": "A simple widget",
"ReleaseDate": "1991-01-01T00:00:00Z",
"DiscontinuedDate": null,
"Rating": 4,
"Price": 2.5
}
我期待状态码为 201 Created
的答复和一个 Location
标题类似 http://services.odata.org/Experimental/OData/(S(<SessionID>))/OData.svc/Products(11)
.
相反,我收到以下错误:
The serialized resource has a null value in key member 'ID'.
Null values are not supported in key members.
所以我想,也许我可以将其设置为任意值,服务将忽略它并发布自己的 ID。所以我尝试以下请求:
POST http://services.odata.org/Experimental/OData/(S(<SessionID>))/OData.svc/Products
Content-Type: application/json
{
"@odata.type": "ODataDemo.Product",
"ID": 0,
"Name": "Widget",
"Description": "A simple widget",
"ReleaseDate": "1991-01-01T00:00:00Z",
"DiscontinuedDate": null,
"Rating": 4,
"Price": 2.5
}
但是,当我这样做时,该服务实际上会使用我提交的 ID 并返回使用该主键的实体 URL,即使具有该键的实体已经存在。
然后当我尝试获取该 URL 时,响应只是说 Syntax Error
.当我查询整个集合时,我可以看到现在有两个实体 ID=0
,以前存在的那个和我创建的那个。
这只是引用服务实现中的一个错误吗?还是 OData 真的没有规定来处理在创建实体时让服务分配主键的(大概很常见的)场景?
最佳答案
这是服务实现中的错误。很可能 ODataDemo.Product
尚未在 ORM 或基础数据库中声明身份种子。
危险信号是,如果发布的结果是 ID 为零(或任何 ID),允许您创建具有相同 ID 的多行并且没有出现错误,则该数据类型没有正确定义。
在服务中按您预期的方式运行(代表您植入身份列),结果将是响应中的 ID 将是基础数据库表的下一个增量 ID,而不是您传入的 ID .
An implementation that allows multiple rows to have the same ID is not OData v4 compliant, unless of course the ID column IS NOT the primary key column. The syntax for selection or operating on a single record depends on the existence and declaration of the column that can be used to uniquely reference each row.
This is the column that is referenced by the value
11
in the brackets in the url:.../Products(11)
关于OData V4.0 : Auto-assign primary key when creating an entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48775820/
这个问题在这里已经有了答案: Range based loop: get item by value or reference to const? (5 个答案) 关闭 6 年前。 如果我有这样的类
最近,我使用 CSS grid 创建了一个布局.虽然这很好用,但我对它的工作原理感到困惑。具体来说,我对 grid-template-rows: auto auto 1fr auto; 这一行感到困惑
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why don't margin-top: auto and margin-bottom:auto work
我几乎已经尝试了所有我知道的方法,但是当我将我的 Android studio 更新到最新版本时,它仍然显示此错误。我该怎么办? gradle.build 是: buildscript { r
我想创建一个deep_flatten函数模板,该模板将生成包含range ed的元素的join。例如,如果仅考虑嵌套的std::vector,我可以拥有: template struct is_ve
我刚刚看了 Scott Meyers Universal References in C++11有一件事我不太明白。 我对作为“通用引用”的 auto 之间的区别感到有点困惑,即 auto&& 和常规
这个问题在这里已经有了答案: C++11 Range-based for-loop efficiency "const auto &i" versus "auto i" (3 个答案) 关闭 3 年
由于 auto 关键字在编译时获取类类型,我想知道使用 auto* 是否有任何效率,或者是否有任何特殊用途该表达式,因为 auto 在编译时已经获得了指针类型。 最佳答案 这个“新奇的 C++11”与
请问我是否正确,对函数返回值使用 auto&& 总是比使用 auto 更好。例如,在 auto val = someObj.getVal(); 如果 getVal() 返回引用,则 val 将是一个拷
有区别吗: template constexpr decltype(auto) f(T&& x) -> decltype(std::get(std::forward(x))) { retur
我想创建一个 deep_flatten会产生 range 的函数模板深的元素join编。例如,如果我们只考虑嵌套 std::vector s,我可以有: template struct is_vec
我在玩auto在 std::pair .在下面的代码中,函数 f应该返回 std::pair依赖于模板参数的类型。 一个工作示例: 示例 1 template auto f() { if c
我是一名 Android 开发人员,我正在尝试开发一个定制的 Android Auto 应用程序,它可以简单地镜像手机屏幕。 我知道目前 API 仅适用于音乐和消息应用程序,但我会编写一个应用程序来镜
我有一个很大的 div,里面有文字: #big-div { height: 400px; overflow: auto; } 如何才能使当新内容添加到 div(并发生溢出)时,div
我正在尝试设计一个网站,其中包含一个带有溢出的内容区域:自动和一个动态高度。最好是,我希望能够在 overflow: auto div 下方放置一个页眉和一个页脚,并让该 div 占用剩余的空间,但到
这个问题在这里已经有了答案: Does 'auto' type assignments of a pointer in c++11 require '*'? (3 个答案) 关闭 6 年前。 以下在
当使用 auto&& 处理返回左值的函数时: int func() { int v=42; return v; } auto && v = func(); 将 v 视为引用而不是左值会产生
我读了一篇关于 auto 类型推导的文章,使用 decltype 我想知道我在下面的例子中关于如何推导类型的逻辑是否正确(所以如果我是有误请指正:) #include using namespace
这个问题在这里已经有了答案: What's the semantically accurate position for the ampersand in C++ references (3 个回答)
假设我有 class Container { public: T getValue() const { return t; } const T& getCRef() const {
我是一名优秀的程序员,十分优秀!