【问题标题】:ODATA posting request in C# for an entity with navigation properties, creates new navigation propertiesC# 中对具有导航属性的实体的 ODATA 发布请求,创建新的导航属性
【发布时间】:2017-03-16 09:25:50
【问题描述】:

我是从 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; }

}

Client 实体中的 Name 和 Order 实体中的 Navigation Property 被注释为“必需”,因为我使用 Attribute Routing 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": ""
    }
  }
}

翻译成英文,表示实体Client的Field名称是必填项。

第一个问题:如何使用 Odata 发布/插入具有导航属性 (fk) 的实体,而无需在发布请求中发送表示导航属性的完整对象以及所有字段?难道不能只发送导航属性的 id / 主键吗?

如果我在请求中发送了用作导航属性的完整实体,则在数据库中创建了订单,但是发生了一件奇怪的事情:导航属性“客户端”被忽略了,一个新的同名客户端为这个插入的实体创建...

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

我做错了什么?

提前致谢。

【问题讨论】:

    标签: c# post foreign-keys odata


    【解决方案1】:

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

    【讨论】:

    • 但是clientId已经在发布的json对象中了,不是吗? :S。而且你的假设是正确的,客户是存在的,一个订单只能有一个客户……
    • 您正在发布帖子,这意味着 odata 将尝试发布(创建)订单和客户。该帖子会忽略您提供的任何密钥并插入新客户端。只需将客户端外键添加到订单中即可。 [ForeignKey("Client")] public string ClientId { get; set; } public virtual Client Client { get; set; } }
    • 问题中提供的 JSON 是否正确?不需要发布到 $ref URL 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    相关资源
    最近更新 更多