【发布时间】: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,而不是为每个引用类型生成它,让它引用一个检查对象的方法,并且只标记未更改的序列化引用.
- 有没有人遇到过这个 以前的问题?
- 您使用了哪些解决方案?
- 你遇到了什么问题 线?
- 如何轻松维护 模板创建了吗?
【问题讨论】:
标签: c# wpf wcf entity-framework self-tracking-entities