我有一个关于EF和WCF的架构问题。 我们正在使用Entity Framework(带有Oracle数据库)和基于WPF的GUI开发三层应用程序。 GUI通过WCF与服务器通信。
我们的数据模型非常复杂(超过一百个表),有很多关系。我们目前正在使用默认的EF代码生成模板,我们在跟踪实体状态方面遇到了很多麻烦。
客户端上的用户界面也相当复杂,有时将具有50个以上对象的对象图发送到单个用户界面,实体之间有多层聚合。能够轻松决定BLL层,在客户端上修改了哪些对象,以及新创建了哪些对象,这是一个重要的目标。
在两个层之间管理实体和实体状态最明智的方法是什么?自我跟踪实体?这种情况下最常见的陷阱是什么?
那些在真实生产环境中使用STE的人能说出他们的经历吗?
答案 0 :(得分:6)
我今天描述了solve this without STEs的方式。关于网络服务的跟踪也有related question(查看@ Richard的答案并提供链接)。
答案 1 :(得分:6)
我们开发了STE的分层应用程序。具有ASP.NET和ModelViewPresenter的用户界面层,业务层,WCF服务层和具有实体框架的数据层。
当我第一次阅读关于STE的文档时,文档说它们比使用自定义DTO更容易。它们应该是“快速简便的方式”,只有在非常大的项目上才能使用手写的DTO。
但是我们使用STE's遇到了很多问题。其中一个主要问题是,如果您的实体来自多个服务调用(例如在主详细信息视图中),并且来自不同的上下文,则在编写服务器上的图形并尝试保存它们时会遇到问题。因此,我们的服务器功能仍然需要手动检查哪些数据已更改,然后重新组合服务器上的对象图。关于这个主题已经写了很多,但它仍然不容易修复。
我们遇到的另一个问题是如果没有WCF,STE将无法运行。在序列化实体时激活更改跟踪。我们最初设计了一个体系结构,其中WCF可以被禁用,服务调用就在进行中(这是我们的单元测试的要求,如果没有wcf并且更容易设置,它将运行得更快)。事实证明,STE不是这个的正确选择。
我还注意到,开发人员有时会在查询中包含大量数据,只是将其发送给客户端,而不是真正考虑他们需要哪些数据。
在这个项目之后,我们决定使用自定义DTO和从服务器到客户端的automapper,并在新项目的数据层中使用POCO模板。
因此,既然您已经声明您的项目很大,我会选择专门为一个目标创建的自定义DTO和服务功能,而不是发送大量数据的“更新(人员)”功能
希望这会有所帮助:)