2014-11-04 105 views
0

我有一個WebAPI OData v3接口使用ODataConventionModelBuilder。它含有可繼承了一些實體,並且還具有抽象對象的集合的模式:ODataConventionModelBuilder與繼承實體

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

我打電話使用微風與客戶端的元數據接口,使用擴展:

http://example.com/api/Object3?$expand=MyObjects

服務器響應看起來是這樣的:

{ 
    "odata.type":"MyNamespace.Object1", 
    "odata.id":"http://example.com/api/BaseObject(1)", 
    "[email protected]":"http://example.com/api/BaseObject(1)/Parent", 
    "Id":1, 
    "ParentId":1 
} 

微風可識別該類型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將具體對象的URI作爲odata.id而不是基礎對象返回?

回答

0

我得到一個討厭的黑客這個工作從所有實體刪除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)可用,微風計算URI到具體模型的控制器。

我不知道是否有更好的解決方案可用,OData API首先發送正確的odata.id。