这个问题源于其他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,但验证和数据库保存发生在另外的单独模块中。我只想在中间剪掉一些手工作品(不得不重建对象结构)。
答案 0 :(得分:0)
解决问题的一种方法是使用type
方法执行工作。在那里,实体已经被反序列化,但仍然不在对象图中。您可以让EF将它们安排在对象图中,方法是将它们附加到单独的上下文(与用于保存的上下文不同)。
有关详细信息,请参阅this SO question and answer。