我是从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被忽略了......
我做错了什么?
提前致谢。
答案 0 :(得分:1)
将客户端forign键添加到订单中,然后发布。这假设客户端已经存在且订单只能有一个客户端。