【问题标题】:ODataConventionModelBuilder with inherited entities具有继承实体的 ODataConventionModelBuilder
【发布时间】: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


    【解决方案1】:

    我通过在使用微风保存之前从所有实体中删除 extraMetadata 来解决这个问题:

    var entities = manager.getEntities(null, breeze.EntityState.Modified);
    for (var i = 0; i < entities.length; i++) {
        delete entities[i].entityAspect.extraMetadata;
    }
    

    如果没有可用的额外元数据(包含 odata.id),微风会计算到具体模型控制器的 URI。

    我不知道是否有更好的解决方案,即 OData API 首先发送正确的 odata.id。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 2011-01-09
      • 2016-03-31
      • 2015-09-01
      • 1970-01-01
      相关资源
      最近更新 更多