我開始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) –