2016-04-19 5 views
0

Этот вопрос возникает из этого другого article. В настоящее время я использую BreezeJS с Entity Framework, но я не верю, что использую его так, как планировалось. В настоящее время я вызываю изменения сохранения в массиве объектов, которые я отправляю на сервер, а затем десериализую их в свою исходную структуру. Я надеюсь, что есть лучший способ сделать это, которого я просто не смог найти. Есть два способа, по которым я могу это сделать, но не могу заставить их работать.BreezeJS saveChanges отправляет массив вместо объекта

Первым было бы отправить массив как отдельный объект, который при десериализации уже был бы в структуре объекта. Когда клиентская сторона является форматом, в котором объект хранится, поэтому он не будет выполнять никаких дополнительных действий.

Второй вариант заключается в том, чтобы каким-то образом использовать массив, который отправляется на сервер, и строить структуру объекта с использованием метаданных платформы Entity Framework в EFContextProvider.

Если возможно, я предпочел бы решение ближе к варианту 1.

Javascript

function saveObjects() { 
    // Assume the child class has a foreign key to the parent 
    var parent = dataService.createEntity('PARENT', parentObject); 
    var child = dataService.createEntity('CHILD', childObject); 

    // Save changes 
    // This is what I'm currently doing because each entity is seperate 
    dataService.saveChanges([parent, child]); 
    // This is what I would like to do 
    // dataService.saveChanges(parent); 
} 

Объект, который в настоящее время отправлены выглядит следующим образом. Я хочу, чтобы РЕБЕНОК действительно был ребенком в объекте PARENT, когда он отправляется через.

// Current saveBundle 
{"entities": [ 
    {"ID: 1, 
    "entityAspect": {"entityTypeName": "PARENT", ...}}, 
    {"PARENT_ID: 1, 
    "entityAspect": {"entityTypeName": "CHILD", ...}} 
]} 

// Ideal saveBundle 
{"entities": [ 
    {"ID: 1, 
     {"PARENT_ID: 1, 
     "entityAspect": {"entityTypeName": "CHILD", ...}}, 
    "entityAspect": {"entityTypeName": "PARENT", ...}}, 

]} 

C#

[HttpPost] 
public SaveResult SaveChanges(JObject saveBundle) 
{ 
    // Currently I have to deserialize each object and rebuild the object 
    // because the save bundle is a list of single entities instead of 
    // the existing object hierarchy 
    PARENT parent = DeserializeEntity(saveBundle, 'PARENT'); 
    parent.child = DeserializeEntity(saveBundle, 'CHILD'); 

    // Custom Validation and Saving is done here 
} 

Я могу использовать BreezeJS неправильно, но проверка и сохранение базы данных происходит в отдельных модулях далее вниз по линии. Я просто пытаюсь вырезать некоторую ручную работу посередине (необходимо перестроить структуру объекта).

+0

Даже когда объекты связаны с клиентом, Breeze разбивает их на массив, чтобы избежать проблем с циклической ссылкой при сериализации в JSON. На сервере EFContextProvider добавляет их в контекст EF; EF автоматически восстанавливает граф объекта во время этого процесса. –

+0

В этом проблема, я не могу найти примеров того, как это делается. На сервере у меня есть массив отправленных объектов, но я не могу понять, как использовать мой EFContextProvider для создания моего объекта из массива. –

+0

Но зачем вам это нужно, когда оно делает это за вас автоматически? –

ответ

0

Один из способов решения вашей проблемы - выполнить работу в методе BeforeSaveEntities. Там сущности уже десериализованы, но все еще не находятся в графе объектов. Вы можете организовать EF в графе объектов для вас, присоединив их к отдельному Контексту (а не к тому, который использовался для сохранения).

Для получения более подробной информации см. this SO question and answer.