OData V4.0:创建实体时自动分配主键
我正在使用OData V4.0 API,我正试图了解如何正确创建实体。我在用这个 我的“天真”假设(基于大多数数据库的工作方式)是,在将实体发布到集合时,我会忽略主键,让服务生成主键并在响应中返回给我 换句话说,当我提出以下要求时:OData V4.0:创建实体时自动分配主键,odata,odata-v4,Odata,Odata V4,我正在使用OData V4.0 API,我正试图了解如何正确创建实体。我在用这个 我的“天真”假设(基于大多数数据库的工作方式)是,在将实体发布到集合时,我会忽略主键,让服务生成主键并在响应中返回给我 换句话说,当我提出以下要求时: POST http://services.odata.org/Experimental/OData/(S(<SessionID>))/OData.svc/Products Content-Type: application/json { "@oda
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
}
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。因此我尝试以下请求:
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
}
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
}
POSThttp://services.odata.org/Experimental/OData/(S())/OData.svc/Products
内容类型:application/json
{
“@odata.type”:“ODataDemo.Product”,
“ID”:0,
“名称”:“小部件”,
“说明”:“一个简单的小部件”,
“发布日期”:“1991-01-01T00:00:00Z”,
“中止日期”:空,
“评级”:4,
“价格”:2.5
}
但是,当我这样做时,服务实际上会使用我提交的ID并使用该主键返回实体URL,即使具有该键的实体已经存在
然后,当我尝试获取该URL时,响应只是说语法错误
。当我查询整个集合时,我可以看到现在有两个ID为0的实体,一个是以前存在的实体,另一个是我创建的实体
这仅仅是参考服务实现中的一个bug吗?或者OData真的没有一个条款来处理在创建实体时让服务分配主键的(可能非常常见)场景吗?这是服务实现中的一个BUG。 最有可能的是,
ODataDemo.Product
未在ORM或基础数据库中使用标识种子声明
红色标志是,如果ID为零(或任何ID)的过帐结果允许您使用相同ID创建多行,并且没有引发错误,则该数据类型未正确定义
在服务按预期运行(代表您设定标识列种子)的情况下,结果是响应中的Id将是基础数据库表的下一个增量Id,而不是您传入的Id
允许多行具有相同ID的实现不符合OData v4,除非ID列不是主键列。选择或操作单个记录的语法取决于可用于唯一引用每一行的列的存在和声明
这是url:../Products(11)
你解决过这个问题吗?我有同样的question@Justin我并没有最终解决这个问题,但对于我正在集成的特定服务,我被告知主键将自动生成,如果丢失,不会触发验证错误。