2011-06-20 37 views
2

我正在使用实体框架和自我跟踪实体使用WPF的个人项目。我有一个WCF Web服务,它为CRUD操作提供了一些方法。今天我决定做一些测试,看看究竟是通过这项服务传播的,尽管我期望这样的事情,但我真的很失望。问题是,对于一个对象的简单更新(或删除)操作 - 可以说类别我向服务器发送整个对象图,包括其所有父类别,其项目,子类别及其项目等。我的情况是一个非常小的数据库(2个主要类别,大约20个总计和大约60个项目)上的170 KB xml文件。我无法想象如果我有一个非常大的数据库会发生什么。自我跟踪实体流量优化

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

一个可能的方法我想出了与更多的服务电话获得我每个对象所需要的数据:

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

相反的:

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

这样的CATEG ories和项目将被分开,并且在更改或删除某些对象时,通过线路发送的数据将会更少。

有没有人遇到类似的问题,您是如何解决这个问题的?或者您是否解决了这个问题?

+0

为什么不使用自我跟踪实体的一个原因。我认为它有一些开销,因为原始值可能通过电线传输。 – yonexbat

+0

是的,他们是。我还认为,就优化和创建严重的应用程序而言,使用ADO.NET或其他技术要好得多,因为您无需发送兆字节数据即可更改单个字母,无论其他好处如何,Entity Framework为您提供。他们对我来说(可能不仅仅是我)不足以让我闭上眼睛。 –

回答

1

我们遇到了类似的挑战。首先,正如你已经提到的那样,就是让实体尽可能小(如所期望的客户端功能所规定的那样)。其次,将实体发送回线路以便持久化时:剥离所有导航属性(嵌套对象),当它们没有更改时。这听起来很简单,但并不重要。我们所做的是递归地挖掘存在于可追踪集合中的实体(称为“最顶层”实体(及其可追踪集合,以及它们,......)),并在其ChangeTracking状态为“未更改”时将其删除。但请小心,因为在某些情况下,您仍然需要这些实体,因为它们已被删除或添加到其父实体的可跟踪集合中(因此您不应删除它们)。

Julie Lerman's - Programming Entity Framework中也提到了这个,我们称之为“StripEntity”(不带任何代码示例或任何其他)。

虽然它可能不像更纯粹的方法那样高效,但STE的使用为针对数据库的查询节省了大量代码。在高流量情况下,我们并不需要优化性能,所以STE适合我们的需求,并带走了大量的代码与数据库进行通信。您必须为您的情况决定“最佳”解决方案。祝你好运!

+0

这是一个有趣的方法!当我有时间时,我会给它一个镜头。谢谢! –

+0

@Ivan:如果你需要一些帮助......也许我可以给你提供一些代码。 –

1

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

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