2017-03-16 69 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) –