在C#中为具有导航属性的实体发布ODATA请求,创建新的导航属性

时间:2017-03-16 09:25:51

标签: c# post foreign-keys odata

我是从Odata开始的新手,我为以下实体定义了Odata Api:

[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; }

}

客户端实体中的名称和订单实体中的导航属性注释为" required"因为我使用属性路由Api来验证控制器中的模型。

当发送(插入)具有Id 1的客户端的新订单(已存在于数据库中)时,我将一个帖子请求与正文中的以下json对象发送到我的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": ""
    }
  }
}

翻译成英文,表示实体客户的字段名称是强制性的。

第一个问题:如何使用Odata发布/插入具有导航属性(fk)的实体,而不在post请求中发送表示导航属性的完整对象,包含所有字段?是不是可以只发送导航属性的id / primary键?

如果我在请求中发送用作导航属性的完整实体,则会在数据库中创建订单,但会发生奇怪的事情:导航属性"客户端"将被忽略,并为此插入的实体创建一个具有相同名称的新客户端...

我的意思是,订单是在表中创建的,但订单的client_id不是1,因为使用提供的名称创建了一个新客户端。但是id被忽略了......

我做错了什么?

提前致谢。

1 个答案:

答案 0 :(得分:1)

将客户端forign键添加到订单中,然后发布。这假设客户端已经存在且订单只能有一个客户端。