EF4 POCO:快照与 WCF 上的自我跟踪

Posted

技术标签:

【中文标题】EF4 POCO:快照与 WCF 上的自我跟踪【英文标题】:EF4 POCO: Snapshot vs Self-tracking over WCF 【发布时间】:2011-01-21 06:32:59 【问题描述】:

去年我使用实体框架(当然是 .NET3.5)为我们的项目开发了数据访问服务,并使用 Julie Lerhman 的书作为开发状态跟踪 POCO 对象的指南。我们使用 WCF,也有 Silverlight 3 客户端。我们正在迁移到 .NET 4.0,我想切换到使用代码生成来消除开发人员在编写 POCO 类和翻译类时浪费的时间。

根据我所做的研究,似乎有 3 种状态跟踪 POCO 的方法:

1) 更改的跟踪代理:似乎对我们没有用,因为这似乎不适用于 WCF 序列化。

2) 基于快照:在检索 POCO 实体图时拍摄快照,将客户端返回的图与该快照进行比较,并比较差异......对我来说似乎很好。

3) 自我跟踪实体:代码生成器生成用于在 POCO 对象内进行自我跟踪的逻辑。这似乎与我们现在所做的很接近,只是它都是为我们生成的。

我正在尝试找出所有这些方法之间的优缺点。我猜测 1 和 2 是“连接的”,并且它们需要最初查询 POCO 的 ObjectContext 以保持实例化,但无法确认这一点。鉴于选项 3 似乎做了同样的事情,而且更多……

快照对我来说似乎是最简单的,但如果这需要 ObjectContext 长时间保持打开状态,我不太确定...

我只是一名初级程序员,因此非常感谢这里的任何建议,尤其是关于 Silverlight 3(我相信选项 2 和 3 与 Silverlight 3 一起使用,但 2 可能有问题)。

【问题讨论】:

作为一个更新,我现在在我们的 WCF/Silverlight 4 应用程序中使用状态跟踪实体,它们工作得很好(尽管在删除方面存在问题)。导航属性现在是 TrackableCollections,它派生自 ObservableCollection,因此在梦中绑定到 XAML。我非常推荐这个解决方案。 ***.com/questions/3814706/… 和 ***.com/questions/6116002/… 的可能重复 【参考方案1】:

选择选项 3。自我跟踪实体,因为这是它们的设计目的。

“自跟踪实体针对序列化场景进行了优化”

This post 给出了很好的示范。

【讨论】:

自我跟踪实体 (STE) 有一个主要缺点。您必须共享 T4 代码生成器生成的代码,STE 才能正常工作。这意味着您不能在客户端使用数据服务引用元数据生成的类,因此仅限于 .NET 客户端。 是的,您无法生成客户端代理是对的。我们手动编写代理代码并在客户端共享代码。从技术上讲,您可以只与您的 .NET 或 Silverlight 客户端共享包含实体的二进制文件(如果您的客户端是 Silverlight,则必须构建与 Silverlight 兼容的 .dll)。 不再。不再推荐 STE。 我同意对自我跟踪实体的反对意见,但 MS 尚未提供真正的替代方案,可以以断开连接的方式跟踪对象图。需要一种解决方案,允许在服务器端断开连接和重新同步时对图形进行操作。从 POCO 中删除跟踪逻辑很好,只要 DbContext 具有一些功能来遍历整个对象图并确定需要更新的内容。目前没有这样的功能。在 DbContext 世界中没有与 STE 等效的东西。【参考方案2】:

其他两个选项仅在对象上下文存在时完成更改时适用。您唯一的选择是 STE。使用 STE,实体将跟踪自己的变化。当修改后的对象图发送到服务器时,您可以播放这些更改,如下所示。 db.Dustomers.ApplyChanges(客户); db.SaveChnages();

使用 STE,您可以在类库项目中创建实体,并在 WCF 客户端、silverlight 客户端、asp.net 和 wpf 之间共享它们。因此,您可以为各种客户端重用实体。

【讨论】:

以上是关于EF4 POCO:快照与 WCF 上的自我跟踪的主要内容,如果未能解决你的问题,请参考以下文章

实体框架4:使用自我跟踪实体的过滤器进行预先加载(包括)

将 MSMQ 端到端跟踪与 WCF 跟踪和应用程序级日志记录相关联

成功创建 Always On SQL Server 快照后,Debezium 未跟踪 CDC

自跟踪实体 SaveChanges() 在多对多关系中添加实体时出现异常

wcf 尝试设置跟踪以进行调试,而不是写入日志文件

可跟踪实体主键违规 EF 4 问题