我开始OData的一个新手,我已经对下列项目定义的OData的API:ODATA帐请求与导航属性的实体,创造了新的导航属性
[Table("clients", Schema = "dbo")]
public class Client
{
public int Id { get; set; }
[Required]
public String Name { get; set; }
}
[Table("orders", Schema = "dbo")]
public class Order
{
public int Id { get; set; }
public DateTimeOffset Date { get; set; } = DateTimeOffset.Now;
[Required]
public virtual Client Client { get; set; }
public String Comment { get; set; }
}
的名称在Client实体中,并且Order实体中的导航属性被标注为“required”,因为我使用Attribute Routing Api来验证我的控制器中的模型。
当过帐(插入)与ID为1的客户新订单(已经存在于数据库中),我的身体返回以下JSON对象POST请求我的OData端点:
{
"Date": "2017-03-16T08:28:47.700Z",
"Client": {
"Id": 1
},
"Comment": "Something"
}
,我收到以下错误信息:
{
"error": {
"code": "",
"message": "The request is invalid.",
"innererror": {
"message": "Order.Client.Name : Das Feld \"Name\" ist erforderlich.\r\n",
"type": "",
"stacktrace": ""
}
}
}
翻译成英文,这意味着对于实体客户端的字段名称是强制性的。
第一个问题:如何在发送请求中发送/插入具有导航属性(fk)的实体而不发送表示导航属性的完整对象与所有字段?是否不可能只发送导航属性的ID /主键?
如果我发送在请求中用作导航属性的完整实体,则会在数据库中创建订单,但会发生一件奇怪的事情:导航属性“客户端”被忽略,并且具有相同名称的新客户端为此插入的实体创建...
我的意思是,订单是在表中创建的,但订单的client_id不是1,因为使用提供的名称创建了新客户端。但ID被忽略...
我在做什么错了?
在此先感谢。
但clientId已经在发布的json对象中,不是吗? :S。你的假设是正确的,客户存在,并且一个订单只能有一个客户... –
你正在做一个帖子,这意味着odata会尝试发布(创建)订单和客户端。该帖子会忽略您提供的任何密钥并插入新的客户端。只需将客户端外键添加到订单中即可。 '[ForeignKey(“Client”)] public string ClientId {get;组; } 公共虚拟客户端客户端{get;组; } ' } –
[使用ASP.NET Web API 2.2的OData v4中的实体关系](https://docs.microsoft.com/zh-cn/aspnet/web-api/overview/odata-support-in-aspnet织网的API /的OData-V4 /实体关系式-的OData-V4) –