0

我有以下代码:

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>
4

1 回答 1

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'
}
于 2013-06-27T21:59:26.753 回答