我有以下代码:
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>
答案 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'
}