跨层/层处理对象图的最佳方法是什么?

时间:2011-01-08 05:58:54

标签: wcf graph entity-framework-4 poco

我们有一个典型的多层/层架构。 Application + WCF Service + Repository / EF4 / Database。

我们正在使用EF POCO T4模板的自定义版本来生成我们在层/层中使用的实体。我们决定不使用DTO,因为需要额外的时间/工作。

一个示例对象是一个森林,它可以具有树的导航属性,可以具有叶子的导航属性。

添加叶子和处理对象图的最佳方法是什么?数据是从客户端导入的,因此我们不一定知道父林/树是否已存在于数据库中。

  1. 查询服务并检索任何现有的相关对象。附加相关对象的图形或创建新对象并在客户端附加图形。 示例:public Forest GetForest(string forestid) 然后--- public void AddLeaf(Leaf leaf)

  2. 在客户端创建林,树和叶对象并附加图形。发送叶对象然后在服务器端执行逻辑以将对象与数据库中的现有对象进行比较。如果需要,剥离图形,添加不存在的项目和/或附加到现有对象。 示例:public void AddLeaf(Leaf leaf)

  3. 在客户端创建林,树和叶对象,但不附加图。发送对象然后在服务端执行逻辑以将对象与数据库中的现有对象进行比较。添加不存在和/或附加到现有对象的项目。 示例:public void AddLeaf(Leaf leaf,Tree tree,Forest forest)

  4. 问题归结为逻辑应该在何处附加这些相关对象的图形。 另外,在处理被序列化和反序列化的图时,我对导航属性的“修正”逻辑有点担心。这似乎可能成为一种昂贵的操作。

    注意:客户端应用程序是导入数据的Windows服务...因此它不一定是轻量级客户端。 (我们不一定害怕为它添加逻辑。)

1 个答案:

答案 0 :(得分:1)

几个月前,我有类似的question。在玩了很多这个问题之后,我最后的决定是使用你的第三个解决方案(我的客户端总是web应用程序)。此解决方案需要编写大量代码,并且包含一些额外的数据库查询,因为每次要更新对象时,都必须先加载整个对象图。原因是当处理分离的对象时,您必须处理change tracking manually

当您使用第三种解决方案时,您还可以涉及DTO并仅在客户端和服务器之间传输真正需要的数据。

如果是statefull客户端(用.NET编写的Windows应用程序或Silverlight),您还可以使用自我跟踪实体和第一种方法。自我跟踪实体是Changeset模式的实现。他们可以在从上下文中分离后跟踪所有更改,但您必须首先从DB加载实体。对于非.NET客户端使用的Web应用程序客户端或服务,自跟踪实体为not a good choice