Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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
C# 使用EF 6.1.1在ASP.NET中使用DbContext_C#_Asp.net_Asp.net Mvc_Entity Framework_Dbcontext - Fatal编程技术网

C# 使用EF 6.1.1在ASP.NET中使用DbContext

C# 使用EF 6.1.1在ASP.NET中使用DbContext,c#,asp.net,asp.net-mvc,entity-framework,dbcontext,C#,Asp.net,Asp.net Mvc,Entity Framework,Dbcontext,由于我一直在使用MVC框架开发我的web应用程序,我一直想知道应该在哪里定义DbContext。我知道内存泄漏,通常情况下,也就是在ConsoleApplication中,我会将DbContext的用法与using(){}子句一起附上。然而,Web应用程序似乎是不同的,我非常确定DbContext的生命周期是不同的,我不能只将其作为控制器处理,然后尝试在视图中读取。也许我错了。起初,我在每个动作中创建多个引用。我的想法是将DbContext定义为每个控制器中的readonly private字段

由于我一直在使用MVC框架开发我的web应用程序,我一直想知道应该在哪里定义
DbContext
。我知道内存泄漏,通常情况下,也就是在
ConsoleApplication
中,我会将
DbContext
的用法与
using(){}
子句一起附上。然而,Web应用程序似乎是不同的,我非常确定
DbContext
的生命周期是不同的,我不能只将其作为控制器处理,然后尝试在视图中读取。也许我错了。起初,我在每个动作中创建多个引用。我的想法是将
DbContext
定义为每个控制器中的
readonly private
字段:

public HomeController : controller
{
    private readonly MyDBContext myDbContext = new MyDBContext();

    // ... and in actions

    public ActionResult Index()
    {
        // ... usage of myDbContext
    }

    public ActionResult Create()
    {
        // ... usage of myDbContext
    }

    public ActionResult Edit()
    {
        // ... usage of myDbContext
    }

    public ActionResult Delete()
    {
        // ... usage of myDbContext
    }
}
你认为这是正确的吗

干杯


编辑: 我将代码更改为:

public ActionResult Index()
{
    IQueryable<MyViewModel> viewModel = null;
    using (MyDBContext dB = new MyDBContext())
    {
        viewModel = from st in dB.Students
                    join d in dB.Departments on st.DepartmentID equals d.DepartmentID
                    join g in dB.Genders on st.GenderID equals g.GenderID
                    select new MyViewModel
                    {
                        StudentID= st.StudentID,
                        StudentName = st.StudentName,
                        Gender = g.GenderName,
                        DepartName = d.DepartmentName
                    };
    }
    return View(viewModel);
}

请注意,代码以其他方式工作,没有任何其他更改,但使用(){}

删除
,没有什么不同。调用视图时,控制器处于死机状态。在控制器中的操作中使用,因此不要保留DbContext


一般来说:MVC与任何其他.NET技术在处理和EF上下文方面都没有什么不同。

尝试一个ToList,如select new{…}.ToList()中所述
您正在尝试从可查询的源访问数据。该源在使用范围结束时关闭。

由于
viewModel
是一个
IQueryable
,因此它不在控制器中保存数据。它包含查询的执行计划,当您在视图中执行此操作时,将执行该计划

@foreach (MyViewModel item in @Model)
出现错误是因为上述语法不在
using
块的范围内,因此
DbContext
已被释放,此时无法执行查询。尽管使用
块删除
会使代码正常工作而不会出现任何错误,但这并不是MVC的最佳实践。模型应该只保存数据,而视图根本不应该执行任何数据库操作

对于您的案例,正确的方法是使用
IEnumerable
而不是
IQueryable
作为模型,因此
viewModel
将在
using
块之后保存数据。您可以使用方法强制执行
块内的查询,如下所示

public ActionResult Index()
{
    IEnumerable<MyViewModel> viewModel = null;
    using (MyDBContext dB = new MyDBContext())
    {
        viewModel = (from st in dB.Students
                    join d in dB.Departments on st.DepartmentID equals d.DepartmentID
                    join g in dB.Genders on st.GenderID equals g.GenderID
                    select new MyViewModel
                    {
                        StudentID= st.StudentID,
                        StudentName = st.StudentName,
                        Gender = g.GenderName,
                        DepartName = d.DepartmentName
                    }).ToList();
    }
    return View(viewModel);
}
public ActionResult Index()
{
IEnumerable viewModel=null;
使用(MyDBContext dB=new MyDBContext())
{
viewModel=(从数据库中的st开始)
将d加入数据库。st.DepartmentID上的部门等于d.DepartmentID
将g加入到dB.Genders中,在st.GenderID上等于g.GenderID
选择新的MyViewModel
{
StudentID=st.StudentID,
StudentName=st.StudentName,
性别=g.GenderName,
部门名称=d.部门名称
}).ToList();
}
返回视图(viewModel);
}
并确保在视图代码的顶部有以下语法

@model IEnumerable<MyViewModel>
@model IEnumerable

您可以查看本文:这两种技术在MVC应用程序中都是相同的,因为在您将操作结果返回到视图后,上下文将不会保持活动状态。您的模型概念不是MVC。模型不应包含任何未具体化的内容。您的select viewmodel永远不应该是延迟查询,所有处理都应该在方法结束时完成。为什么会延迟?我该怎么处理呢?这是我能控制的吗?我根据我的知识尽我所能!如果试图访问ViewOK中的导航属性,请使用ToList函数和Include。现在我很困惑。我按照您的建议,将
DbContext
包含在控制器中的
using(){}
中,并将ViewModel返回到
View()
,我得到了一个异常:“操作无法完成,因为DbContext已被释放。”我将编辑问题以显示导致异常的代码!如果您的视图可以访问DbContext,那么您对MVC的理解就严重错误。模型应该只包含数据,视图不应该对模型执行任何数据库操作。您违反了最佳做法,并将处理放在视图中。这不是MVC。事实上,程序的工作方式与我预期的不同并不意味着我对MVC有错误的理解。代码是错误的,因为我没有意识到某些事情。现在我是,我已经改变了密码!你在这里对我的批评很有意义。我不知道为什么,我来这里学习更多?你必须明白,我正处于学习力学的阶段,不仅在MVC背后,而且在ASP.NET本身!!
@model IEnumerable<MyViewModel>