2017-03-16 49 views
0

我开始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被忽略...

我在做什么错了?

在此先感谢。

回答

1

将客户端forign密钥添加到订单,只是发布。这假设客户端已经存在,并且订单只能有一个客户端。

+0

但clientId已经在发布的json对象中,不是吗? :S。你的假设是正确的,客户存在,并且一个订单只能有一个客户... –

+0

你正在做一个帖子,这意味着odata会尝试发布(创建)订单和客户端。该帖子会忽略您提供的任何密钥并插入新的客户端。只需将客户端外键添加到订单中即可。 '[ForeignKey(“Client”)] public string ClientId {get;组; } 公共虚拟客户端客户端{get;组; } ' } –

+0

[使用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) –