2

这是一个通用的架构问题,希望对那些已经在最终应用程序中使用 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,而不是为每个引用类型生成它,让它引用一个检查对象的方法,并且只标记未更改的序列化引用。

  • 有没有人遇到过这个问题?
  • 您使用了哪些解决方案?
  • 你遇到了哪些问题?
  • 维护创建的模板有多容易?
4

1 回答 1

0

我不知道整个应用程序的设计,但是如果您通常将工作批次加载到服务中,然后将其发送给客户端进行使用,看起来服务层在某种程度上是不必要的,您可以直接从数据库加载数据(并且您将获得更好的性能)。根据计算的复杂性,您还可以直接在数据库中进行一些计算,您将再次获得更好的性能。

您仅保存部分图表的方法是滥用 STE 概念。STE 以方式工作 - 您加载图表、修改图表并保存相同的图表。如果您想拥有一个大数据集来读取并只保存小块,那么加载数据集以供读取可能会更好,一旦您决定更新一个块,再次仅加载该块,对其进行修改并将其发回。

干扰内部 STE 行为是在某些角落/意外情况下丢失某些更改的最佳方法。

顺便提一句。这在某种程度上看起来像是将本地数据库与全局数据库同步的场景——我从来没有这样做过,但它在智能客户端中很常见。

于 2011-05-10T14:37:45.627 回答