BreezeController не получает JObject (он равен нулю)

У меня есть приложение javascript, использующее BreezeJs.

Когда я вызываю saveChanges, объекты преобразуются в javascript и отправляются по сети. (Я подтвердил это со скрипачом.)

Но когда я устанавливаю точку останова в своем контроллере веб-API, JObject для SaveChanges имеет значение null.

Я не могу понять, почему.

Вот пример того, как настроен мой контроллер:

[BreezeController]
public class ShipmentController : ApiController
{
    [HttpGet]
    public string Metadata()
    {
        return dataAccess.Metadata();
    }
    [HttpGet]
    public IQueryable<Shipment> Shipments()
    {
        return dataAccess.Shipments();
    }


    //   This is what is NULL each time --------+
                                                |
                                                |
    [HttpPost]                                  V
    public SaveResult SaveChanges(JObject saveJObject)
    {
        return dataAccess.SaveChanges(saveJObject);
    }

    //... Other stuff to get data
}

Мои запросы на получение данных через контроллер работают нормально. Так что это не сценарий полного провала.

И, как я сказал выше, Fiddler показывает действительный JSON, передаваемый по сети. Но почему-то контроллер не берет.

Мое единственное предположение состоит в том, что у меня есть несколько объектов, которые я добавляю в свои сущности бриза на стороне клиента. Но я сделал это, как указано в документации, и они появляются в разделе __unmapped скрипта JSONin объекта.

Есть ли у кого-нибудь идеи, которые я могу попытаться выяснить, почему мой контроллер веб-API не получает JObject?


person Vaccano    schedule 19.02.2016    source источник


Ответы (2)


Обратите внимание, что если у вас нет свойств навигации, определенных в вашей модели на стороне сервера, вы можете создать свойства навигации в метаданных на стороне клиента, если у вас есть свойства внешнего ключа для работы:

    var childEntityType = metadataStore.getEntityType("MyChildEntity");
    childEntityType.addProperty(new breeze.NavigationProperty({
        name: "myParent",
        entityTypeName: "MyParentEntity:#My.Namespace",
        isScalar: true,
        associationName: "MyChildEntity_MyParentEntity",
        foreignKeyNames: ["myParentId"]
    }));

Вы должны добавить эти связи сразу после получения метаданных с сервера и перед созданием каких-либо сущностей или выполнением каких-либо запросов.

    entityManager.fetchMetadata().then(function () {
        patchMetadata(entityManager.metadataStore); // add missing navigations
    });

С добавленным свойством навигации Breeze будет автоматически подключать связанные объекты по запросу, поэтому вам не нужно создавать несопоставленные свойства.

person Steve Schmitt    schedule 20.02.2016
comment
Очень хорошо! Благодарю вас! - person Vaccano; 20.02.2016

Итак, моя база данных устарела, и поэтому я отрабатываю представления данных. Это означает, что я не могу вставить внешние ключи в свою модель уровня базы данных.

Модель Entity Framework также не имеет никаких ассоциаций.

Итак, я вручную построил эти отношения на стороне клиента, добавив сущности и несопоставленные свойства к другим сущностям. (Так что в приведенном выше примере у Shipment будет OriginId: int в фактическом объекте, но я бы добавил несопоставленное свойство Origin. Но Origin сам был объектом, который я получил в качестве справочных данных.)

Оказывается, это не поддерживается: https://github.com/Breeze/breeze.js/issues/85

Когда я изменил свою модель, чтобы у меня не было сущностей как несопоставленных сущностей, и SaveChanges работало правильно.

person Vaccano    schedule 19.02.2016