这是一个通用的架构问题,希望对那些已经在最终应用程序中使用 EF 的人来说。
我们有一个典型的 N 层应用程序:
- WPF 客户端
- WCF 服务
- EF STE DTO
- EF 数据层
应用程序在加载期间(在用户登录的同时)加载所有已知的业务类型,然后按需加载一个非常大的“工作批次”,这个批次大约为 4-8Mg,由超过 1000 个业务对象组成。当我们完成加载这个“批处理”时,我们会将所有内容与之前加载的业务类型等链接起来……
最后,我们在内存中有大约 2K-5K 的业务对象都正确引用,因此我们可以在客户端使用和滥用 LINQ,我们还在客户端对所有这些对象进行了一些复杂的数学运算,所以我们真的需要大图.
当我们想要保存对数据库的更改时,问题就来了。有了这么大的对象图,我们几乎不想通过网络再次发送所有内容。
鉴于目前 T4 模板的复杂性,我不喜欢我们当前的方法是在更新时分离和附加所有内容。我们基本上想要更新一个给定的对象,将它与图的其余部分分离,通过网络发送它,在 WCF 端更新它,然后在客户端再次重新附加它。主要问题是当您想要更新链接对象时,假设您添加了一些对也添加的东西有引用的东西,然后是对修改过的东西的另一个引用,等等。这迫使很多客户端代码确保我们不这样做'不要破坏任何东西。
所有这些都是通过生成的代码完成的,所以我们谈论的是每个模板 200-800 行 T4 代码。
我现在正在研究的是一种自定义 STE 的序列化和反序列化的方法,这样我就可以控制通过网络发送的内容,并且能够更新批次而不是仅仅更新单个 STE。检查引用,查看这些引用是否未更改;如果不是,则不要序列化,如果是,则只需将其附加到 WCF 端的上下文即可序列化和更新所有内容。
经过一番研究,我找到了这种方法的两种解决方案。
一种是编写自定义 DataContractSerializer。
第二个是通过更改由 EF 创建的 STE 模板并使用 KnownTypeAttribute,而不是为每个引用类型生成它,让它引用一个检查对象的方法,并且只标记未更改的序列化引用。
- 有没有人遇到过这个问题?
- 您使用了哪些解决方案?
- 你遇到了哪些问题?
- 维护创建的模板有多容易?