N 层应用程序上的实体框架自我跟踪实体
Posted
技术标签:
【中文标题】N 层应用程序上的实体框架自我跟踪实体【英文标题】:Entity Framework Self Tracking Entities on a N-Tier application 【发布时间】:2011-08-22 12:39:32 【问题描述】:这是一个一般性的架构问题,希望对那些已经在最终应用程序中使用 EF 的人来说。
我们有一个典型的 N 层应用程序:
WPF 客户端 WCF 服务 EF STE DTO 的 EF 数据层应用程序在加载期间(在用户登录的同时)加载所有已知的业务类型,然后按需加载一个非常大的“Work Batch”,这批大约 4-8Mg,由超过 1.000 个业务组成对象。当我们完成加载这个“批处理”时,我们会将所有内容与之前加载的业务类型等链接起来......
最后,我们在内存中有大约 2K-5K 的业务对象都正确引用,因此我们可以在客户端使用和滥用 LINQ,我们还在客户端对所有这些对象进行了一些复杂的数学运算,所以我们真的需要大图。
当我们想要将更改保存到数据库时,问题就出现了。有了这么大的对象图,我们几乎不想通过网络再次发送所有内容。
鉴于目前 T4 模板的复杂性,我不喜欢我们当前的方法是在更新时分离和附加所有内容。我们基本上想更新一个给定的对象,将它与图的其余部分分离,通过网络发送它,在 WCF 端更新它,然后在客户端再次重新附加它。主要问题是当您想要更新链接对象时,假设您添加的东西具有对也添加的东西的引用,然后是对修改的东西的另一个引用,等等。这迫使很多客户端代码确保我们不'不要破坏任何东西。
所有这些都是通过生成的代码完成的,所以我们谈论的是每个模板 200-800 行 T4 代码。
我现在正在研究的是一种自定义 STE 序列化和反序列化的方法,这样我就可以控制是否通过网络发送,并且能够更新批次而不是单个 STE。检查引用,查看这些引用是否未更改;如果不是不序列化,如果是序列化并更新所有内容,只需将其附加到 WCF 端的上下文。
经过一番研究,我找到了这种方法的 2 个解决方案。
一种是通过编写自定义 DataContractSerializer。
第二个是通过更改由 EF 创建的 STE 模板并使用 KnownTypeAttribute,而不是为每个引用类型生成它,让它引用一个检查对象的方法,并且只标记未更改的序列化引用.
有没有人遇到过这个 以前的问题? 您使用了哪些解决方案? 你遇到了什么问题 线? 如何轻松维护 模板创建了吗?【问题讨论】:
【参考方案1】:我不知道整个应用程序的设计,但是如果您通常将工作批次加载到服务中,然后将其发送给客户端进行使用,看起来服务层在某种程度上是不必要的,您可以直接从数据库中加载数据(并且您将获得更好的性能)。根据计算的复杂性,您还可以直接在数据库中进行一些计算,您将再次获得更好的性能。
您只保存部分图表的方法是滥用 STE 概念。 STE 以方式工作 - 您加载图表、修改图表并保存相同的图表。如果您想拥有一个大数据集来读取并只保存小块,那么加载数据集以供读取可能会更好,一旦您决定更新一个块,再次仅加载该块,修改它并将其发回。
干扰内部 STE 行为是在某些角落/意外情况下丢失某些更改的最佳方法。
顺便说一句。这在某种程度上看起来像是一种将本地数据库与全局数据库同步的场景 - 我从未这样做过,但它在智能客户端中很常见。
【讨论】:
并非如此,因为这是通过 Internet 使用的,直接公开 SQL Server 是不可能的,基础结构规则、DMZ 等会阻止您这样做。更不用说有些人会使用这个应用程序是在受控的互联网内部,通常端口 80 对 HTTP 是开放的,而对 SQL Server 的 TCP 端口 1433 是多次关闭的。 我们不能只拥有对象图的块,因为对整个图应用了一些繁重的数学运算,从而更新了很多。最终结果是用户看到和感知的。我们也没有得到整个数据库,因为它包含几个这样的大型对象图,我们一次只加载一个,根据用户的需求。业务是管理对欧洲研发资金的申请,所以我们需要加载整个“项目”,计算需要削减的内容、实际成本、投资、合法与否、实际情况如何由基金等支付。 好的,现在使用 WCF 是有意义的,但是通过 WCF 将本地 DB 与全局 DB 同步的想法(使用 MS Sync 框架应该是可能的)听起来像是问题少得多的解决方案。我不认为 STE 是您所需要的,因为它们的目的不同。 嗯,我在设计架构的第一个版本时研究了 Sync,但让我放弃的原因是您必须存储数据的本地副本,或者通过实现本地存储或通过部署 SQL Server Express(一旦部署将禁用单击),并且 STE 还为您提供了一些开箱即用的良好 WPF 绑定功能,许多关系被实现为 TrackableCollection,它围绕 ObservableCollection 等进行了包装。现在它运行良好,它正在生产中,并且没有数据丢失。问题是模板看起来很难看,我认为存在更好的方法 同步框架也支持 .NET compact,一旦您拥有本地存储,您也可以直接将 EF 与数据绑定一起使用。模板看起来很丑,它们难以开发、难以维护、难以调试等,但仍然没有人说您的更改会起作用,因为一件事是修改对象图,另一件事是使其与内部 STE 跟踪保持一致。以上是关于N 层应用程序上的实体框架自我跟踪实体的主要内容,如果未能解决你的问题,请参考以下文章
n 层项目中的实体框架 ObjectContext 生命周期