Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有继承实体的ODataConventionModelBuilder_C#_Asp.net Web Api_Odata_Breeze - Fatal编程技术网

C# 具有继承实体的ODataConventionModelBuilder

C# 具有继承实体的ODataConventionModelBuilder,c#,asp.net-web-api,odata,breeze,C#,Asp.net Web Api,Odata,Breeze,我有一个使用ODataConventionModelBuilder的WebAPI-odatav3接口。它包含一些继承的实体,以及一个包含抽象对象集合的模型: public abstract class BaseObject { [Key] public int Id { get; set; } [ForeignKey("Object3")] public int? ParentId { get; set; } public virtual Object

我有一个使用
ODataConventionModelBuilder
的WebAPI-odatav3接口。它包含一些继承的实体,以及一个包含抽象对象集合的模型:

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现在将其识别为Object1类型的实体。但是如果我修改实体并保存更改,它会向
发出POST请求http://example.com/api/BaseObject(1) 
。为了能够处理不同的具体类型,我需要POST请求转到特定的控制器
http://example.com/api/Object(1) 

我需要更改什么,以便Breeze更新对具体控制器而不是基本对象控制器的POST调用


更新:在检查了Breeze源代码之后,Breeze似乎使用odata.id作为POST请求的URI。是否有可能让OData API以OData.id而不是基本对象的形式返回具体对象的URI?

在使用breeze保存之前,我通过删除所有实体中的外部元数据来解决这个问题:

var entities = manager.getEntities(null, breeze.EntityState.Modified);
for (var i = 0; i < entities.length; i++) {
    delete entities[i].entityAspect.extraMetadata;
}
var entities=manager.getEntities(null,breeze.EntityState.Modified);
对于(变量i=0;i
如果没有可用的外部元数据(包含odata.id),breeze将计算到具体模型控制器的URI

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

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