访问ASP .NET MVC中的实体管理器

时间:2009-05-29 01:17:30

标签: asp.net-mvc entity-framework

问候, 尝试分类提供访问我的实体管理器的最佳方式,同时通过允许延迟加载的请求保持上下文打开。我看到了很多例子如下:

public class SomeController
{
     MyEntities entities = new MyEntities();
}

我在这个设置中看到的问题是,如果你想要调用一层业务类,你最终必须将管理器作为参数传递给这些方法,如下所示:

public static GetEntity(MyEntities entityManager, int id)
{
      return entityManager.Series.FirstOrDefault(s => s.SeriesId == id);
}

显然,我正在寻找一种好的,线程安全的方法,在不传递方法的情况下将entityManager提供给方法。这种方式也需要是单元可测试的,我先前尝试将它放入Session中并不适用于单元测试。

我实际上正在寻找在ASP .NET MVC中为企业级应用程序处理实体框架的推荐方法。

提前致谢

3 个答案:

答案 0 :(得分:2)

Entity Framework v1.0在Windows窗体应用程序中表现优异,您可以根据需要使用对象上下文。特别是在asp.net和mvc中,它有点难度。我的解决方案是使存储库或实体管理器更像MVC可以与之通信的服务。我创造了一种generic all purpose base repository我可以随时随地使用它,并且只是停止了太多关于做正确的事情。我会尽量避免让对象上下文打开,甚至比Web应用程序中绝对需要的时间长。

看看EF4。我开始在生产环境中使用EF,当它处于beta 0.75或类似的情况下并且没有真正的问题,除了它有时是“辛勤工作”。

答案 1 :(得分:1)

您可能希望查看Repository模式(这里是使用Linq to SQL的存储库write up)。

基本思想是,不是创建静态类,而是实例化一个版本的Repository。您可以将EntityManager作为参数传递给构造函数中的类 - 或者更好的是,可以为类创建EntityManager的工厂,以便它可以执行管理器的工作单元实例化。

对于MVC,我使用基本控制器类。在这个类中,您可以创建实体管理器工厂并使其成为类的属性,因此派生类可以访问它。允许它从构造函数注入,但如果传入的实例为null,则使用正确的默认值创建。每当控制器方法需要创建存储库时,它都可以使用此实例传递到存储库,以便它可以创建所需的管理器。

通过这种方式,您可以摆脱静态方法,并允许在单元测试中使用模拟实例。通过传入工厂 - 应该创建实现接口的实例,顺便说一下 - 你将存储库与实际的管理器类分离。

答案 2 :(得分:0)

不要在视图中延迟加载实体。不要在视图中进行业务层调用。在控制器中预先加载视图需要的所有实体,计算控制器中预先需要的所有总和和平均值。毕竟,这就是控制器的用途。