我使用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而不是基础对象返回?
答案 0 :(得分:0)
我通过在使用breeze保存之前从所有实体中删除extraMetadata来解决这个问题:
var entities = manager.getEntities(null, breeze.EntityState.Modified);
for (var i = 0; i < entities.length; i++) {
delete entities[i].entityAspect.extraMetadata;
}
没有extraMetadata(包含odata.id)可用,breeze计算具体模型的控制器的URI。
我不知道是否有更好的解决方案,OData API首先会发送正确的odata.id。