EF4 POCO:快照与自跟踪在WCF上的区别

12
去年我使用Entity Framework(当然是.NET3.5版本),并参考了Julie Lerhman的书籍,开发了一个数据访问服务,在此基础上开发了状态跟踪POCO对象。我们使用WCF,并拥有Silverlight 3客户端。现在我们要升级到.NET 4.0,我想采用代码生成来消除开发人员编写POCO类和转换类所浪费的时间。
根据我的研究,似乎有3种跟踪POCO状态的方法:
1)更改跟踪代理:这对我们似乎没用,因为它看起来无法在WCF序列化中工作。
2)基于快照:在检索POCO实体图时进行快照,将从客户端返回的图与该快照进行比较并查找差异...我认为这很不错。
3)自跟踪实体:代码生成器会为在POCO对象内执行自跟踪的逻辑生成代码。这似乎接近于我们现在正在做的事情,只是全部由代码生成器为我们生成。
我试图弄清楚所有这些方法之间的优缺点。我猜测1和2是“相关的”,需要保留最初查询POCO的ObjectContext实例,但尚未能确认。我也不明白为什么任何人真正关心选项1,因为选项3似乎可以做到相同或更多的事情...
对我来说,快照似乎是最简单的,但如果这需要一个ObjectContext长时间保持打开状态,我就不太确定...
作为一名初级程序员,我很感激任何关于此的建议,尤其是与Silverlight 3相关的(我相信选项2和3都适用于Silverlight 3,但选项2可能存在问题)。

作为更新,我们现在在WCF/Silverlight 4应用程序中使用状态跟踪实体,并且它们运行得非常好(尽管删除方面存在问题)。导航属性现在是可跟踪集合,这些集合派生自ObservableCollection,因此在XAML中进行绑定非常方便。我非常推荐这个解决方案。 - MrLane
可能是 https://dev59.com/9W865IYBdhLWcg3wcOHG 和 https://dev59.com/KFfUa4cB1Zd3GeqPI4mZ 的重复问题。 - Danny Varod
2个回答

14

选择选项3。自跟踪实体,因为它们就是为此而设计的。

"自跟踪实体被优化用于序列化场景"

这篇文章提供了很好的演示。


10
自跟踪实体(STE)有一个主要的缺点。您必须共享由T4代码生成器生成的用于STE正常工作的代码。这意味着您无法在客户端使用数据服务引用元数据生成的类,因此仅限于.NET客户端。 - Tri Q Tran
是的,你说得对,无法生成客户端代理。我们手工编写了代理并在客户端共享了代码。从技术上讲,您可以只分享包含实体的二进制文件给您的.NET或Silverlight客户端(如果您的客户端是Silverlight,则必须构建与Silverlight兼容的.dll)。 - MrLane
不再推荐使用 STE。 - DarthVader
我同意对Self Tracked Entities的反对意见,但微软还没有提供真正的替代方案,可以在断开连接的情况下跟踪对象图。需要的是一种解决方案,允许在断开连接时操作图形,并在服务器端重新同步。从POCO中删除跟踪逻辑是可以的,只要DbContext具有遍历整个对象图并决定需要更新什么的某些功能即可。目前没有这样的功能。在DbContext世界中没有STE的等效物。 - MrLane

2
其他两个选项只适用于在对象上下文存在时进行更改。你唯一的选择是STE。使用STE,实体将跟踪自己的更改。当修改后的对象图发送到服务器时,您可以像下面展示的那样播放这些更改。 db.Dustomers.ApplyChanges(customer); db.SaveChnages();
使用STE,您可以在类库项目中创建您的实体,并在WCF客户端、Silverlight客户端、ASP.NET和WPF之间共享它们。这为您提供了在各种客户端中重用实体的机会。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接