私は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; }
}
名前クライアントエンティティでは、Orderエンティティのナビゲーションプロパティには「必須」と注釈が付けられます。これは、属性ルーティングApiを使用してコントローラのモデルを検証するためです。
(挿入)(すでにデータベースに存在する)IDが1のクライアントのための新しい秩序を投稿するとき、私は私のODataエンドポイントに体に次のJSONオブジェクトを持つPOSTリクエストを送信します。
{
"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)を持つエンティティを投稿/挿入するにはどうすればよいですか?ナビゲーションプロパティのid/primaryキーだけを送信することはできませんか?
リクエストでナビゲーションプロパティとして使用された完全なエンティティを送信すると、注文がデータベースに作成されますが、奇妙なことが起こります。ナビゲーションプロパティ "Client"は無視され、同じ名前の新しいクライアントこの挿入されたエンティティに対して作成されます...
つまり、注文はテーブルに作成されますが、新しいクライアントが作成されたため、提供された名前を使用して注文のclient_idは1ではありません。しかし、IDは無視されました...
私は間違っていますか?
ありがとうございます。
しかし、clientIdは既に投稿されたjsonオブジェクトにありますか? :S。あなたの前提は正確で、クライアントは存在し、注文には1人のクライアントのみがいることができます... –
odataが注文とクライアントの両方を投稿(作成)しようとする投稿をしています。ポストはあなたが提供するキーを無視し、新しいクライアントを挿入します。クライアントの外部キーを注文に追加するだけです。 '[ForeignKey(" Client ")] パブリック文字列ClientId {get;セット; } パブリック仮想クライアントクライアント{get;セット; } –
[ASP.NET Web API 2.2を使用したOData v4のエンティティの関係](https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet) -web-api/odata-v4 /エンティティ関係 - データ - v4) –