2

我正在使用带有实体框架和自我跟踪实体的 WPF 进行个人项目。我有一个 WCF Web 服务,它公开了一些用于 CRUD 操作的方法。今天我决定做一些测试,看看这个服务实际上会发生什么,即使我预料到会发生这样的事情,我真的很失望。问题在于,对于仅针对一个对象的简单更新(或删除)操作 - 假设我向服务器发送整个对象图的类别,包括其所有父类别、它们的项目、子类别及其项目等。我我的案例是一个 170 KB 的 xml 文件,位于一个非常小的数据库(2 个主要类别,总共大约 20 个和大约 60 个项目)。我无法想象如果我有一个非常大的数据库会发生什么。

我试图用谷歌搜索一些关于 STE 流量优化的文章,但没有成功,所以我决定在这里询问是否有人做过类似的事情,知道一些好的做法等。

我提出的一种可能方法是通过更多服务调用来获取每个对象所需的数据:

return context.Categories.ToList();//only the categories
...
return context.Items.ToList();//only the items

代替:

return context.Categories.Include("Items").ToList();

这样,类别和项目将被分开,并且在进行更改或删除某些对象时,通过网络发送的数据会更少。

你们中是否有人遇到过类似的问题,您是如何解决的或者您是如何解决的?

4

2 回答 2

1

我们遇到了类似的挑战。首先,正如您已经提到的,是使实体尽可能小(由所需的客户端功能决定)。其次,当通过网络将实体发送回以进行持久化时:在所有导航属性(嵌套对象)未更改时剥离它们。这听起来很简单,但绝不是微不足道的。我们所做的是递归地挖掘存在于可跟踪集合中的实体,例如“最顶层”实体(以及它们的可跟踪集合,以及它们的......),并在它们的 ChangeTracking 状态为“未更改”时将其删除。但要小心这一点,因为在某些情况下,您仍然需要这些实体,因为它们已被删除或添加到其父实体的可跟踪集合中(因此您不应该删除它们)。

这就是我们所说的“StripEntity”,在Julie Lerman 的 - Programming Entity Framework中也提到了(没有任何代码示例或任何内容) 。

尽管它可能不如更纯粹的方法有效,但使用 STE 可以节省大量用于查询数据库的代码。我们不需要在高流量情况下获得最佳性能,因此 STE 适合我们的需求,并带走了大量代码来与数据库通信。您必须根据自己的情况决定“最佳”解决方案是什么。祝你好运!

于 2011-06-29T21:55:02.567 回答
1

您可以在http://selftrackingentity.codeplex.com/找到实体框架项目项。在 0.9.8 版本中,我添加了一个名为的方法,该方法GetObjectGraphChanges()返回一个优化的实体对象图,其中仅包含有更改的对象。

此外,还有两种辅助方法:EstimateObjectGraphSize()EstimateObjectGraphChangeSize(). 第一种方法返回整个实体对象的估计大小及其对象图;后者返回优化的实体对象图的估计大小,仅包含有变化的对象。使用这两个辅助方法,您可以决定调用是否有意义GetObjectGraphChanges()

于 2011-09-29T13:48:53.117 回答