Entity framework 在静态类库中放置db上下文的利弊

Entity framework 在静态类库中放置db上下文的利弊,entity-framework,entity-framework-4,entity-framework-4.1,entity-framework-5,Entity Framework,Entity Framework 4,Entity Framework 4.1,Entity Framework 5,我们有一个静态类库来处理重复的多上下文任务。作为静态类的成员创建EF db上下文是一种不好的做法吗 DB上下文的处置是有原因的。频繁地处理它们可以保持连接池的“流动”,并且可能(我在这里猜测)可以确保表不会保持锁定状态 那么,在静态类中使用db上下文会带来麻烦吗?还是我想得太多了?在我看来,这绝对不是您想要做的事情 实际上,锁定并不是您在这里遇到的主要问题。EF只会在save changes调用的持续时间内锁定(实际上,与大多数其他ORM使用的部分提交事务相比,使用跟踪图的最大好处之一) 跟踪图

我们有一个静态类库来处理重复的多上下文任务。作为静态类的成员创建EF db上下文是一种不好的做法吗

DB上下文的处置是有原因的。频繁地处理它们可以保持连接池的“流动”,并且可能(我在这里猜测)可以确保表不会保持锁定状态


那么,在静态类中使用db上下文会带来麻烦吗?还是我想得太多了?

在我看来,这绝对不是您想要做的事情

实际上,锁定并不是您在这里遇到的主要问题。EF只会在save changes调用的持续时间内锁定(实际上,与大多数其他ORM使用的部分提交事务相比,使用跟踪图的最大好处之一)


跟踪图本身会让你变灰。EF的工作原理(在大多数情况下)是,它保存了它所见过的每个实体的一个副本,并在其中循环查找更改的内容,并运行一个名为fixups的过程,该过程使导航属性与反向链接一起工作。这个过程循环遍历上下文所见过的每个实体,并在一系列操作(添加、附加、删除、保存、查询和其他一些操作)中调用。这意味着,如果跟踪图很大,则此过程可能需要相当多的时间。如果您让上下文永远保持活动状态,跟踪图的大小将趋向于数据库的大小,这将使跟踪图变得笨拙和缓慢。

这取决于许多因素,但这里有一些想法,例如:

  • 如果您在服务层上使用EF,那么并发性可能是一个问题,因为我不认为使用EF上下文是线程安全的,也就是说,您可以同时从所有线程使用它而不会出现问题
  • 如果您的实体被上下文跟踪(我认为即使您没有跟踪),那么上下文将逐渐变大,最终它可能包含所有数据库实体,然后您将遇到性能问题

无论如何,我认为这是个坏主意。

谢谢你的确认。我同意。谢谢你的确认。我同意。@davea有一点旁注,我使用依赖注入来管理上下文生命周期,每个请求都有一个新实例(在基于web的场景中),或者每次都有一个新实例。Luke,我已经阅读了DI作为一种模式的相关内容,并理解了它的一些价值。使用Ninject这样的框架对我有帮助吗?@davea我在我所有的web项目(以及其他一些类型的项目)中都使用Ninject,并且发现它非常有用。它解决的问题是对象生命周期,即何时/如何构造对象以及何时处置对象。在我看来,它对上下文的消费者最有用,但我仍然使用它来管理上下文生命周期。我个人推荐它,如果你想看到我如何使用ninject和EF的示例,请查看我的通用存储库帖子上的代码:底部的示例解决方案很有用。谢谢!我一定会仔细阅读的。如果你有时间,我建议你修改你的答案,包括Ninject。再次感谢。