使用查找修补实体

时间:2013-06-27 00:02:52

标签: entity-framework odata asp.net-web-api

我有以下代码:

public class MyPatchController : EntitySetController<Books , int>
{ 
   protected override Books PatchEntity(int key, Delta<Books> patch)
        {
            var Book = db.books.FirstOrDefault(p => p.ID== key);
            if (Book == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }

            patch.Patch(Book);
            db.SaveChanges();
            return Book ;
        }
}

Books实体具有AuthorID外键。但是,客户端需要使用作者的名称(而不是ID)执行PATCH,并将json发送为

{AuthorName : "Joe Smith"}

AuthorName不在Book的模型中。

我想要做的是使用linq查找authorID,但Odata不会让我在修补时混合和匹配模型。

我有办法让这项工作成功吗?

注意,我已尝试在模型中使用导航,但无效

编辑: $元数据:

<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="1.0">
  <edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="3.0" m:MaxDataServiceVersion="3.0">
    <Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm" Namespace="Store.Models">
      <EntityType Name="BOOK">
        <Key>
          <PropertyRef Name="BOOK_ID"/>
        </Key>
        <Property Name="BOOK_ID" Type="Edm.Int32" Nullable="false"/>
        <Property Name="BOOK_NAME" Type="Edm.String"/>
        <Property Name="AUTHOR_ID" Type="Edm.Int32"/>
      </EntityType>
      <EntityType Name="AUTHOR">
        <Key>
          <PropertyRef Name="AUTHOR_ID"/>
        </Key>
        <Property Name="AUTHOR_ID" Type="Edm.Int32" Nullable="false"/>
        <Property Name="AUTHOR_NAME" Type="Edm.String"/>
      </EntityType>
    </Schema>
    <Schema xmlns="http://schemas.microsoft.com/ado/2009/11/edm" Namespace="Default">
      <EntityContainer Name="Container" m:IsDefaultEntityContainer="true">
        <EntitySet Name="Author" EntityType="Store.Models.Author"/>
        <EntitySet Name="Book" EntityType="Store.Models.Book"/>
      </EntityContainer>
    </Schema>
  </edmx:DataServices>
</edmx:Edmx>

1 个答案:

答案 0 :(得分:1)

从$ metadata,看起来书籍和作者之间没有任何关系(我在模型中看不到任何导航属性)。因此,使用OData执行此操作的方法是在Book上定义操作“UpdateAuthor”,然后调用它。

模型构建器代码

var books = builder.EntitySet<Book>("books");
var updateAuthor = books.EntityType.Action("UpdateAuthor");
updateAuthor.Parameter<string>("name");

您的控制器代码

[HttpPost]
public void UpdateAuthor([FromODataUri]int key, ODataActionParameters parameters)
{
    string name = (string)parameters["name"];

    // patch the author of book with id 'key'.
}

你会把这个json张贴到~/Author(42)/UpdateAuthor

{
    'name' : 'Joe Smith'
}