2017-12-08 10 views
1

Web APIのodataコントロールを使用して多対多のテーブルを挿入しようとしています。Web API 2 - OData v3 - 多対多のテーブルのodataクエリを挿入します。

model

Db scheme

そして私はEFで足場ODATAコントローラと作成されたコントロールVEの。 すべてがgreateです。私はこのようにユーザーテーブルを照会することができます:

GET http://localhost:51875/odata/Users(1)?$expand=Roles 

{ 
    "odata.metadata": "http://localhost:51875/odata/$metadata#Users/@Element", 
    "Roles": [ 
     { 
      "ID": 20, 
      "Name": "Admin" 
     } 
    ], 
    "ID": 1, 
    "UserName": "user", 
    "Password": "pass", 
    "EnteredDate": "2017-12-07T14:55:22.24", 
    "LastLoginDate": null, 
    "Active": true 
} 

私はレコード 'Admin'を手動で挿入しました。ユーザーに新しい役割を追加するにはどうすればよいですか?

私が試した、それは動作しませんでした

PATCH http://localhost:51875/odata/Users(1) 

{ 
    "Roles": [ 
     { 
      url : "http://localhost:51875/odata/Roles(10)" 
     } 
    ], 
} 

。手伝って頂けますか?

+0

コントローラに新しいアクションを追加する必要はありますか?私は非スタンダートな行動をしたくない –

答えて

0

少し遅れて、おそらくこれに対する答えはそこにある、それが上に説明されていますdocs.microsoft.com/...

あなたUserControllerに次のCreateRef方法追加:

[AcceptVerbs("POST", "PUT")] 
public IHttpActionResult CreateRef([FromODataUri] int key, string navigationProperty, [FromBody] Uri link) 
{ 
    var user = Db.Users 
      .FirstOrDefault(p => p.Id == key); //Get User by id 
    if (user == null) 
    { 
     return NotFound(); 
    } 

    switch (navigationProperty) 
    { 
     case "Roles": 
      // You'll have to impement this 'getkey' method somehow. 
      // You could implement it yourself or take a look on the webpage I linked earlier. 
      var relatedKey = GetKeyFromUri(link); 
      var role = Db.Roles 
        .FirstOrDefault(f => f.Id == relatedKey); //Get Role by id 
      if (role == null) 
      { 
       return NotFound(); 
      } 

      user.Roles.Add(role); 
      break; 

     default: 
      return StatusCode(HttpStatusCode.NotImplemented); 
    } 
    Db.SaveChanges(); 
    return StatusCode(HttpStatusCode.NoContent); 
} 

を今、あなたがして、ユーザーにロールを追加することができます次のHTTPリクエスト:

PUT [...]/api/User(2)/Roles/$ref 
Content-Type: application/json 
Content-Length: 54 
{ "@odata.id": "[...]/api/Role(4)/" } 

個人的に私はこの方法が特にいいとは思いませんが、標準です。また、あなたのコメントで言及しているように、カスタム 'AddRoles'アクションでこれを行うこともできます。

関連する問題