实体框架和ObjectContext引用

时间:2012-03-02 05:15:29

标签: entity-framework objectcontext

我正在玩Entity Framework,看看它如何在我正在开发的新项目中使用。我将我的edmx文件放在类库中,因此实体(和数据库访问)可以在多个地方使用。目前我有一个Web项目和一个控制台项目都引用了类库。

我的一个实体有一个用静态方法定义的Partial类。该方法的目的是接受一些参数并创建特定类的一个或多个实例。我的第一个方法版本创建了一个ObjectContext实例,创建了Entity类(或类),并将实体返回给调用方法。然后,调用方法更新了一些属性,并尝试使用新的ObjectContext实例保存实体。显然这没有用,因为实体被绑定(正确的术语??)到静态方法中创建的Context。

经过一番研究,我修改了静态方法,也接受了一个ObjectContext引用,以确保所有实体在哪里创建,然后再使用相同的Context进行操作和保存。这种方法很好,但设计感觉不对。

假设我的一个静态方法可能会变得更多,或者我的应用程序(尤其是Web应用程序)可能会从其他层(DAL甚至是服务层)中受益,那么所有这些类都需要它们才有意义一个ObjectContext参数?

我已经读过很多帖子,通过Singleton模式创建一个ObjectContext是个坏主意,因为“很多客户端会使用同一个对象”。我的问题是我不明白这是怎么可能的。在本地控制台应用程序中,只有一个用户在运行该应用程序。在Web应用程序中,每个请求上只有一个用户。用户共享问题在哪里?没有一篇文章/帖子提到它......但是他们引用了在应用程序上下文中存储对象实例的Singleton模式?

我还看到过关注Web使用的帖子,并通过HttpContext对象将对象实例存储在用户Session对象中。这是有道理的,但似乎并不能解决非网络使用问题。

我认为无论什么解决方案合适(静态方法,工厂对象等)都很可能在我的类库中实现,所以很明显它需要支持Web和非Web解决方案。也许检查HttpContext以确定它正在运行的环境。

我希望http://www.west-wind.com/weblog/posts/2008/Feb/05/Linq-to-SQL-DataContext-Lifetime-Management能提供丰富的信息,但我很难将自己的脑袋包裹在帖子中,示例代码对于实例化和共享一个简单的对象来说似乎有些过分。 (虽然我确信我没有得到它......)

任何想法都表示赞赏。

感谢。

1 个答案:

答案 0 :(得分:0)

问题不在于“许多客户端会使用相同的对象。”问题是ObjectContext旨在成为一个单独的工作单元。如果你将它用于许多不同的工作单元,你会发现存在许多问题。

  • 内存使用量将增长并增长。
  • 您的应用程序将变慢,因为对象修正必须增加工作量。
  • 多线程不起作用

解决方案是以预期的方式使用ObjectContext,即作为单个工作单元。

相关问题