Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在ASP.NETMVC中访问实体管理器_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc 在ASP.NETMVC中访问实体管理器

Asp.net mvc 在ASP.NETMVC中访问实体管理器,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,您好, 尝试通过最佳方式进行排序,以提供对我的实体管理器的访问,同时通过请求保持上下文打开,以允许延迟加载。我看到很多这样的例子: public class SomeController { MyEntities entities = new MyEntities(); } 我看到的这个设置的问题是,如果您有一层要调用的业务类,那么最终必须将管理器作为参数传递给这些方法,如下所示: public static GetEntity(MyEntities entityManager, i

您好, 尝试通过最佳方式进行排序,以提供对我的实体管理器的访问,同时通过请求保持上下文打开,以允许延迟加载。我看到很多这样的例子:

public class SomeController
{
     MyEntities entities = new MyEntities();
}
我看到的这个设置的问题是,如果您有一层要调用的业务类,那么最终必须将管理器作为参数传递给这些方法,如下所示:

public static GetEntity(MyEntities entityManager, int id)
{
      return entityManager.Series.FirstOrDefault(s => s.SeriesId == id);
}
显然,我正在寻找一种好的线程安全的方法,为方法提供entityManager而不传递它。该方法还需要是单元测试的,我以前尝试将其置于会话中,但对单元测试不起作用

实际上,我正在寻找一种推荐的方法来处理企业级应用程序ASP.NETMVC中的实体框架


提前感谢

Entity Framework v1.0在Windows窗体应用程序中表现出色,您可以在其中随意使用对象上下文。特别是在asp.net和mvc中,这有点困难。我的解决方案是使存储库或实体管理器更像MVC可以与之通信的服务。我创造了一种我可以在任何时候使用的方法,只是不再为做对而烦恼太多。我会尽量避免让对象上下文保持打开状态的时间比web应用程序中绝对需要的时间长一毫秒


看看EF4。我是在beta 0.75或类似版本的生产环境中开始使用EF的,除了有时会“费力”之外,它没有任何实际问题。

Entity Framework v1.0在Windows窗体应用程序中表现出色,在这些应用程序中,您可以随心所欲地使用对象上下文。特别是在asp.net和mvc中,这有点困难。我的解决方案是使存储库或实体管理器更像MVC可以与之通信的服务。我创造了一种我可以在任何时候使用的方法,只是不再为做对而烦恼太多。我会尽量避免让对象上下文保持打开状态的时间比web应用程序中绝对需要的时间长一毫秒


看看EF4。我开始在生产环境中使用EF是在beta 0.75或类似版本中,除了有时是“繁重的工作”之外,它没有任何实际问题。

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

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

您可能需要查看存储库模式(这里是一个包含Linq到SQL的存储库的示例)

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

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


这样,您就摆脱了静态方法,并允许在单元测试中使用模拟实例。通过传入一个工厂(该工厂应该创建实现接口的实例,顺便说一句),您可以将存储库与实际的manager类解耦。

您可能需要查看存储库模式(这里是一个包含Linq到SQL的存储库)

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

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


这样,您就摆脱了静态方法,并允许在单元测试中使用模拟实例。通过传入一个工厂——该工厂应该创建实现接口的实例,顺便说一句——您将存储库与实际的manager类分离。

我不知道,伙计,这似乎有很多重复的代码,特别是如果您有管理和匿名部分。我会觉得把Get*代码集中到一个中心位置会更好,因为我需要改变把它带回来的方式。我同意你关于聚合逻辑的观点,如果你只在一个地方使用automapper()将你需要的域的部分映射到你发送到视图的DTO中的属性。我不知道,伙计,这似乎有很多重复的代码,特别是如果你有管理和匿名部分。我会觉得把Get*代码集中到一个中心位置会更好,因为我需要改变把它带回来的方式。在聚合逻辑方面,我同意你的观点,如果你只在一个地方使用automapper()来映射域中