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;
}