Entity framework 4 EF4 DAL设计和ObjectContext:与同事的争论

Entity framework 4 EF4 DAL设计和ObjectContext:与同事的争论,entity-framework-4,data-access-layer,objectcontext,self-tracking-entities,Entity Framework 4,Data Access Layer,Objectcontext,Self Tracking Entities,我与一位高级开发人员合作,他是.NET架构师大师。在过去的6个多月里,我们进行了许多建设性的争论,一般来说,我承认在大多数讨论中失败了。我从和他一起工作中学到了很多东西。然而,有一个设计问题我们目前不同意,我希望得到一些意见/建议,因为他还没能说服我他的立场,我会坚持到底,直到有人能证明我错了 我们使用实体框架4.0,在不同的模型中使用持久性感知实体和自跟踪实体。我们开始使用自跟踪实体来跟踪实体图的更改,这些更改通过WCF连接到Silverlight应用程序进行序列化/反序列化。它工作得非常好。

我与一位高级开发人员合作,他是.NET架构师大师。在过去的6个多月里,我们进行了许多建设性的争论,一般来说,我承认在大多数讨论中失败了。我从和他一起工作中学到了很多东西。然而,有一个设计问题我们目前不同意,我希望得到一些意见/建议,因为他还没能说服我他的立场,我会坚持到底,直到有人能证明我错了

我们使用实体框架4.0,在不同的模型中使用持久性感知实体和自跟踪实体。我们开始使用自跟踪实体来跟踪实体图的更改,这些更改通过WCF连接到Silverlight应用程序进行序列化/反序列化。它工作得非常好。我们也已经开始对模型使用自跟踪实体,这些模型我们没有在WCF中使用,但许多仍然是持久感知实体/模型

我的同事认为实体框架ObjectContext应该在尽可能短的时间内保持不变。他坚持认为,它应该只存在于执行查询所需的时间长度和保留某些内容所需的时间长度。与实体一起完成的任何业务工作都应独立完成。对于我们拥有的每个实体模型,我们都有一个查询类和一个持久性类,它们都是IDisposable的,在实例范围内有ObjectContext,在方法中有查询/持久性逻辑。我们在业务逻辑中使用这些查询/持久性类,而不是在业务逻辑中直接使用ObjectContext。在构造这些类实例时,ObjectContext也是如此;在释放时,ObjectContext也是如此。这些类就像围绕LINQ操作的包装器,将EF与业务逻辑分离,并协助LINQ查询重用

现在首先考虑非自我跟踪实体:

我理解他为什么想要这个,也不希望有一个长期运行的ObjectContext,但我的问题是,他总是希望即使是微不足道的业务逻辑也能从ObjectContext中分离出来,而我们在设计中有一个单独的查询和持久性上下文这一事实意味着我们的业务逻辑中使用的实体没有ObjectContext状态跟踪。对于非自跟踪实体,这意味着如果我们修改业务逻辑中的实体,我们还必须在持久化之前手动设置实体的修改状态。当持久化具有多个更改的复杂图时,这是一个真正的难题。我也怀疑我们能像EF自动做的那样手动做

对于我们的自跟踪实体来说,这种情况是相同的,因为跟踪仅在图形反序列化时打开,因此当在执行查询的服务中工作时,与上下文分离,仍然没有自跟踪实体的跟踪

我的问题是,实体框架使用的最佳实践是什么,实体框架应该如何设计?ObjectContext应该存在多长时间?业务逻辑是否应该始终与ObjectContext分离?如果是这样的话,我们在脱离ObjectContext工作时如何进行状态跟踪?我考虑的一个选项是将所有实体转换为自跟踪实体,并使用一些图形遍历代码遍历查询的图形,并为图形中的所有实体启用跟踪,以便即使在服务端工作时也启用自跟踪(基本上模拟自跟踪实体图反序列化时发生的情况)

我并不是建议我们将ObjectContext保留很长一段时间,但在查询和持久性之间分离工作,失去ObjectContext状态跟踪的好处对我来说似乎很愚蠢……我们正在失去EntityFramework的一个巨大好处


很抱歉发了这么长的帖子……感谢您的帮助。

Microsoft建议ObjectContext应该是短期的,我的经验使我相信ObjectContext的生命周期应该与web请求/用户操作的持续时间相关联

我犯了一个错误,试图在桌面应用程序中使用一个全局的、长寿命的对象上下文,这是一个彻底的灾难。如果你要实现像缓存、下/重做编辑语义之类的东西,那么你应该考虑一个设计,它使用与基础数据实体完全分离的视图模型类。tityFramework可帮助您构建模型对象图,然后在此基础上构建ViewModel。当您希望保存更改时,允许ViewModel存储库重新连接到基础实体,更改其属性并保存更改。这允许进行更“可缓存”、灵活、ORM独立、单元测试友好的设计


在变更跟踪方面,尽量不要将其视为廉价的“用户做出的变更”UI的机制,但这是一种昂贵的机制,用于跟踪在保存更改时需要考虑哪些最近创建的实体。

我认为我的同事的印象是ObjectContext会一直打开数据库连接,直到处理ObjectContext为止。。。