【发布时间】:2014-11-05 21:59:59
【问题描述】:
我有一个使用 ODataConventionModelBuilder 的 WebAPI OData v3 接口。它包含一些被继承的实体,以及一个具有抽象对象集合的模型:
public abstract class BaseObject
{
[Key]
public int Id { get; set; }
[ForeignKey("Object3")]
public int? ParentId { get; set; }
public virtual Object3 Parent { get; set; }
}
public class Object1: BaseObject
{
}
public class Object2: BaseObject
{
}
public class Object3
{
[Key]
public int Id { get; set; }
public ICollection<BaseObject> MyObjects { get; set; }
}
我正在使用带有客户端元数据的 Breeze 调用接口,使用 expand:
http://example.com/api/Object3?$expand=MyObjects
服务器响应如下所示:
{
"odata.type":"MyNamespace.Object1",
"odata.id":"http://example.com/api/BaseObject(1)",
"Parent@odata.navigationLinkUrl":"http://example.com/api/BaseObject(1)/Parent",
"Id":1,
"ParentId":1
}
Breeze 现在将其识别为 Object1 类型的实体。但是,如果我修改实体并保存更改,它会向http://example.com/api/BaseObject(1) 发出 POST 请求。为了能够处理不同的具体类型,我需要将 POST 请求转到特定的控制器 http://example.com/api/Object(1)。
我需要更改什么,以便 Breeze 更新对具体控制器而不是基础对象控制器的 POST 调用?
更新:检查 Breeze 源代码后,Breeze 似乎使用 odata.id 作为 POST 请求的 URI。是否有可能让 OData API 将具体对象的 URI 作为 odata.id 而不是基础对象返回?
【问题讨论】:
标签: c# asp.net-web-api odata breeze