DTO和实体框架

时间:2013-07-02 06:10:31

标签: c# entity-framework design-patterns

我的解决方案使用Entity Framework,我将EF模型转换为DTO对象,以便从UI层上下传递。

但我有一个设计问题:我有一个Person表和一个PersonUnavailibility表。一个人可以有一段时间不可用。

我的PersonDTO对象具有PersonEF模型的所有属性,以及List<PersonUnavailibilityDTO>个对象。所以,当我找到我的人时,我也会得到不可用的人。

但是,我的PersonUnavailibilityDTO应该有一个PersonDTO对象吗?所以如果我得到一个PersonUnavailibilityDTO对象,我可以看到它与哪个人相关?

如果是这样,我会得到一份循环引用。我的PersonUnavailibilityDTO's Person属性有一个列表,列出了所有PersonUnavailibility行...并且每个行都有一个PersonDTO,每个行都有....等等。

这类东西的最佳设计是什么?只包含与父对象相关的子对象?

也就是说,只有PersonDTO的列表中包含PersonUnavailibilityDTOs,但PersonUnavailibilityDTO没有PersonDTO

4 个答案:

答案 0 :(得分:2)

取决于。

在大多数情况下,由于您将从人物视图中查看dto,因此不需要它,并且始终通过此人访问不可用性。

但是当您访问对象时,相反的方法是将此人添加到不可用状态。

尽量让你的Dto尽可能小巧简约。

答案 1 :(得分:0)

一种可能的方法是使用通用复合dto模型来承载所有可能的实体组合。

http://netpl.blogspot.com/2010/12/generic-dto-model-and-other-silverlight.html

以失去严格结构的代价,你得到一个可重复使用的结构。

答案 2 :(得分:0)

作为一般建议,最好避免对象之间的双向关系。

风险是让对象不同步,即对象A指向B(或B的集合)但B不指向A - 通常,它将具有空引用。为了防止这种情况发生,你总是必须保持关系的两端同步,这是有代价的。

然而,当对象是不可变的时(这可能是你的DTO的情况),这一点得到了缓解,因为它们是在创建时组合的,之后从未修改过,从而消除了它们之间出现差异的风险。

正如Jeroen指出的那样,我仍然建议寻求最简单的解决方案:PersonDTO -> PersonUnavailibilityDTO,直到明确证明你需要相反的关系。

答案 3 :(得分:0)

我更喜欢从DTO中删除集合并添加服务方法来代替请求集合:

function GetUnavailable(PersonID, Options) as IEnumerable(of PersonUnavailabilityDTO)

这样

  1. 没有循环引用

  2. DTO往往重量轻

  3. 可以使用额外的过滤器,直接在数据库中应用的排序或分页来整齐地指定实际的集合