【问题标题】:Self Tracking Entities Traffic Optimization自我跟踪实体流量优化
【发布时间】:2011-06-20 22:11:05
【问题描述】:

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

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

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

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

代替:

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

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

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

【问题讨论】:

  • 不使用自我跟踪实体的一个原因。我认为它有一些开销,因为原始值也可能通过线路传输。
  • 是的,他们是。我还认为,在优化和创建严肃的应用程序方面,最好只使用 ADO.NET 或其他技术,您不必发送数兆字节的数据来更改单个字母,而不管实体框架的其他好处为您提供。它们不足以让我(可能不仅仅是我)闭上眼睛。

标签: wpf wcf entity-framework self-tracking-entities


【解决方案1】:

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

Julie Lerman's - Programming Entity Framework 中也提到了这个我们称之为“StripEntity”的东西(没有任何代码示例或任何其他内容)。

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

【讨论】:

  • 这是一个有趣的方法!有空的时候我会试一试。谢谢!
  • @Ivan:如果您需要帮助...也许我可以为您提供一些代码。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多