我正在尝试使用前端的REACT.JS和后端的基于C#EntityFramework的REST API开发应用程序。
假设我有这样的实体关系:
Form ONE-TO-MANY Element
Element ONE-TO_MANY Attribute
我要做的是一个简单的控制器,可以简单地添加/更新/删除所有相关实体的表格。
我在REACT中创建了一个具有以下结构的应用程序:
<SyncComponent>
<FormComponent>
<ElementsList>
<ElementComponent>
<AttributesList>
<AttributeComponent>
<SyncComponent>
,意味着执行AJAX请求到resver,将获得Form的完整JSON表示,可能如下所示:
新Form
已创建:
{"name":"MyNewForm", "elements":[{"name":"MyNewElement","attributes":[{"name":"MyNewAttribute","value":"MyValue"}]}]}
新Element
已添加到现有Form
:
{"id": 1, "name":"MyExistingForm", "elements":[{"name":"MyNewElement","attributes":[{"name":"MyNewAttribute","value":"MyValue"}]}]}
更新了现有Element
中的属性,并将新Element
添加到Form
:
{
"id":123,
"name":"MyExistingForm",
"elements":[
{
"id":321
"name":"MyExistingElement",
"attributes":[
{
"id":456
"name":"MyExisitngAttribute",
"value":"MyUpdatedValue"
},
{
"name":"MyNewAttribute",
"value":"MyNewValue"
}
]
},
{
"name":"MyNewElement",
"attributes":[
{
"name":"MyNewAttribute",
"value":"MyNewValue"
}
]
}
]
}
...所以基本上是一个具有任意分配的CREATE和UPDATE任务的树(DELETE任务将调用,如果JSON中缺少elemnt,但它存在于数据库/对象表示形式的数据库中)。我知道只有在发生小的变化时我才需要发送整个大对象,但我发现仍然比在每次实体更改时发送单独的请求要好得多。首先,我看到我的方法在客户端更容易实现,其次,我将最终得到一个请求而不是打,最后,应用程序意味着允许用户进行多个更改表单,完成后,点击“保存”按钮更新状态。这样,我不能以不一致的状态结束,例如。当某些请求的某些AJAX失败时,有些请求会失败等。
要在服务器端同步此JSON,我已自动生成MVC API控制器。
我坚持的问题是EntityFramework无法正确解析给定JSON到任意深度的对象图。它适用于深度1,但不是更深。
通过示例解释:
在调用PutForm()
函数时(查看下面的代码),form
属性显然包含Form
的实例,form.elements
包含已传递Element
的集合,但{ {1}}始终为空,即使在JSON中传递了一些form.elements.toList[0].attributes
。
attribute
如何强制EntityFramework从JSON正确构建完整对象图,我可以执行原子更新/创建/删除这个任意复杂的实体图吗?
答案 0 :(得分:0)
@Brett Caswell 你完全正确
您在问题上提供的最相关信息是 &#34; form.elements.toList [0] .attributes总是为空,即使...... 传递的属性&#34;
详细描述,简单问题。集合attributes
的名称与模型对象中的属性并不完全对应,所以一旦我更改了它,映射就开始工作(到任何深度),所以现在我只需要迭代它们并将状态设置为添加或修改,具体取决于ID是否为0。