2014-11-04 3 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; } 
} 

Я звоню интерфейс, используя Breeze с клиентской стороны метаданных, используя расширения:

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 
} 

Breeze теперь распознает это как объект типа Object1. Но если я изменяю объект и сохраняю изменения, он делает POST-запрос http://example.com/api/BaseObject(1). Чтобы иметь возможность обрабатывать различные типы бетона, мне нужен запрос POST для перехода к конкретному контроллеру http://example.com/api/Object(1).

Что нужно изменить, чтобы Breeze делал для обновления POST-вызовов конкретному контроллеру, а не контроллеру базового объекта?

UPDATE: После проверки исходного кода Breeze, похоже, что Breeze использует odata.id как URI для запроса POST. Возможно ли, чтобы API OData возвращал 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 к контроллеру конкретной модели.

Я не знаю, есть ли лучшее решение, что API OData отправляет правильный odata.id в первую очередь.

Смежные вопросы