懒加载不工作数据库的第一种方法

问题描述:

我正在研究Asp.Net MVC项目,并使用EF来访问数据库。由于某些原因,我无法首先使用代码,所以我使用数据库第一方法,并且lazyLoading在启用时不起作用!懒加载不工作数据库的第一种方法

public ActionResult ListAll() 
{ 
    List<Album> albums = new List<Album>(); 
    using (newsDBEntities context = new newsDBEntities()) 
    { 
     albums = context.Albums.ToList(); 
     return View(albums); 
    } 


    } 

和视图
@foreach(project.Models.Album专辑型号) {

List<project.Models.Image> img = album.Images.Take(3).ToList(); 
    <div class="albumHolder"> 
    @foreach (var item in img) 
    { 
     <div class="imageHolder"> 
     <img src ="@item.imageURL" width="200px" height="200px" /> 
     </div> 
    } 
    <p class="albumP">@album.albumName</p> 
    </div> 
} 
<div></div> 
</div> 

:比如我不能处置的DbContext后做类似下面的代码的一些事情在下面的例外情况中,我试图在视图中使用3个模型元素:

ObjectContext实例已被处置,不能再用于需要连接的操作灰。

我想知道为什么它不应该加载图像,而启用延迟加载。我也想知道为什么它可以在控制台应用程序中执行类似的代码时起作用!

+0

当处理上下文时,不再有与​​数据库的连接。那么延迟加载如何加载导航属性而不连接到数据库呢? – 2014-11-14 23:01:06

+0

这是正确的,但我用.toList(),应强制EF tu执行查询,然后专辑应该是一个局部变量 – 2014-11-14 23:05:16

+0

你的'相册'是本地的,但你的'图像'不是本地... – 2014-11-14 23:09:06

修订ANSWER

OK,看来你正在试图做延迟加载的看法,我认为这是行不通的。相反,我认为你应该确保在视图中你需要的所有数据都被加载到控制器中。在你的情况下,我认为你需要包含图像细节数据。尝试将控制器中的代码更改为

// At the top of your class code: 
using System.Data.Entity; 

// And then inside the using clause: 

albums = context.Albums.Include(x => x.Images).ToList(); 

这将确保专辑的图像在视图中可用,因此不需要延迟加载。

+0

我知道这会起作用,但实际上在实际的代码中,我将相册传递给视图,然后在视图中尝试拍摄3张专辑的元素,然后我得到异常,我希望所有图像都可以加载到专辑中,这样我就可以使用他们没有数据库连接 – 2014-11-14 23:17:22

+0

我编辑我的问题,这是我想要做的实际事情 – 2014-11-14 23:25:38

+0

我不知道包括存在......多数民众赞成真棒。 – misterManager 2014-11-15 03:30:19