如何使用EF + Web API处理深层对象?

时间:2016-01-16 14:26:27

标签: c# entity-framework asp.net-web-api2

这是我的第一个问题,所以请保持温和。

我有一个数据库模型,包含大约60个描述信息和工业过程各种功能的对象。最终结果是约。 10层深的物体。

我的目的是

  • 以JSON格式向客户端发送顶级对象
  • 双向绑定所述对象(以角度,但是nvm)并操纵它
  • 让客户端的AJAX调用引用该顶级对象
  • 通过Web API中的一个或两个构造函数调用来重建所述对象
  • 通过顶级对象方法更改对象并保存更改

我的解决方案是创建一个基于EF的对象的附加层,以允许从发送到客户端的对象中随意省略/添加数据,避免循环引用的问题和急切引起的其他问题/延迟加载。这些对象被提供给Web API。

现在问题出现在这里: 作为附加层的结果,每当保存EF对象在链中的变化时,都需要从附加层重建EF对象。跟上这一切变得越来越艰难。

对象高度互联且受约束。我应该只为EF对象编写扩展来模拟附加层的功能吗? 如果是这种情况,那么JavaScriptSerializer会尝试序列化所有关系中的所有对象(其中序列化对象的键被定义为另一个对象中的FK)?因为这是我从错误消息中收集到的内容。

或者我这样做错了吗?

1 个答案:

答案 0 :(得分:2)

在像您这样的断开连接的应用中,我删除所有导航属性。起初它们似乎很方便,但一路上会引起麻烦。

我相信通过Id访问所有实体是可行的方法 您可以编写一个 JavaScript类,负责每个Id 接收实体,因此可以对其进行缓存。
因此,每次在客户端上需要实体时,您都可以通过此类获得它。

这将导致每个实体拥有一个控制器。

另一个优点是你不必总是发送和接收整个对象图,这看起来像很多数据(10级深度很多)。

  

JavaScriptSerializer不会尝试序列化所有关系中的所有对象

是的,它会。这就是具有导航属性的对象(尤其是循环对象)非常难以序列化的原因之一。