具有继承实体的ODataConventionModelBuilder

本文关键字:ODataConventionModelBuilder 实体 继承 | 更新日期: 2023-09-27 18:29:05

我有一个使用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,而不是基本对象?

具有继承实体的ODataConventionModelBuilder

我用一个讨厌的黑客破解了这个问题,在用微风保存之前从所有实体中删除了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。

相关文章:
  • 没有找到相关文章