BreezeJS saveChanges发送一个数组而不是一个对象

时间:2016-04-19 15:35:52

标签: entity-framework breeze

这个问题源于其他article。我目前正在使用带有实体框架的BreezeJS,但我不相信我按照预期的方式使用它。目前,我正在调用我发送到服务器的实体数组上的保存更改,然后将它们反序列化为其原始结构。我希望有一个更好的方法来做到这一点,我一直无法找到。有两种方法,我认为我可以做到这一点,但无法使它们发挥作用。

首先将数组作为单个对象发送,当反序列化时,该对象已经存在于对象结构中。当客户端是对象所保留的格式时,不会进行任何额外的工作。

第二个选项是以某种方式使用发送到服务器的数组,并使用EFContextProvider中的Entity Framework Metadata构建对象结构。

如果可能的话,我宁愿选择更接近第一选择的解决方案。

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

当前发送的对象如下所示。我希望CHILD在发送过来时真正成为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,但验证和数据库保存发生在另外的单独模块中。我只想在中间剪掉一些手工作品(不得不重建对象结构)。

1 个答案:

答案 0 :(得分:0)

解决问题的一种方法是使用type方法执行工作。在那里,实体已经被反序列化,但仍然不在对象图中。您可以让EF将它们安排在对象图中,方法是将它们附加到单独的上下文(与用于保存的上下文不同)。

有关详细信息,请参阅this SO question and answer