【问题标题】:EF4 POCO: Snapshot vs Self-tracking over WCFEF4 POCO:快照与 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。我非常推荐这个解决方案。

标签: wcf entity-framework poco snapshot self-tracking-entities


【解决方案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 之间共享它们。因此,您可以为各种客户端重用实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2011-08-24
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多