2012-04-11 2 views
0

데이터베이스에서 최신 뉴스를 가져 오려고하지만 계속이 오류가 발생합니다. The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.이 오류는 NewsEntity.GetObject() 메서드에서 발생합니다. LazyLoading을 사용하도록 설정 한 ToList를 추가하고 개체 세트를 만드는 방식을 변경했습니다. 나는 저자와 아이콘의 로딩을 꺼냈다. 그러나 나는 그것들을 필요로했다. 어떤 도움을 주셔서 감사합니다.최신 뉴스, ObjectContext 인스턴스가 삭제되었습니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data.Objects; 
using Web.Repository.Entity; 

namespace Web.Repository 
{ 
    public class WebModelContext : ObjectContext 
    { 

     private IObjectSet<MemberEntity> _members; 
     private IObjectSet<IconEntity> _icons; 
     private IObjectSet<NewsEntity> _news; 

     public WebModelContext() 
      : base("name=WebRepository", "WebRepository") 
     { 
      ContextOptions.LazyLoadingEnabled = true; 

      _members = CreateObjectSet<MemberEntity>(); 
      _icons = CreateObjectSet<IconEntity>(); 
      _news = CreateObjectSet<NewsEntity>(); 
     } 

     public IObjectSet<MemberEntity> Members 
     { 
      get { return _members; } 
     } 

     public IObjectSet<IconEntity> Icons 
     { 
      get { return _icons; } 
     } 

     public IObjectSet<NewsEntity> News 
     { 
      get { return _news; } 
     } 
} 

} : 이것은 내 데이터베이스 컨텍스트 클래스는

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Web.Repository.Entity 
{ 
    public class News : BaseObject 
    { 
     public int Id { get; set; } 
     public string Title { get; set; } 
     public string Summary { get; set; } 
     public string Content { get; set; } 
     public int IconId { get; set; } 
     public DateTime Posted { get; set; } 
     public int AuthorId { get; set; } 
     public bool Deleted { get; set; } 

     public Member Author { get; set; } 
     public Icon Icon { get; set; } 
    } 
} 

입니다 : 이것은 (데이터 전송 용) 내 NewsObject 클래스는

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Web.Repository.Entity 
{ 
    public class NewsEntity : BaseEntity<News> 
    { 
     public int Id { get; set; } 
     public string Title { get; set; } 
     public string Summary { get; set; } 
     public string Content { get; set; } 
     public int Icon { get; set; } 
     public DateTime Posted { get; set; } 
     public int Author { get; set; } 
     public bool Deleted { get; set; } 

     public virtual MemberEntity AuthorEntity { get; set; } 
     public virtual IconEntity IconEntity { get; set; } 

     public override News GetObject() 
     { 
      return new News 
      { 
       Id = Id, 
       Title = Title, 
       Summary = Summary, 
       Content = Content, 
       IconId = Icon, 
       Icon = IconEntity.GetObject(), 
       Posted = Posted, 
       AuthorId = Author, 
       Author = AuthorEntity.GetObject(), 
       Deleted = Deleted 
      }; 
     } 
    } 
} 

입니다 : 여기

내 NewsEntity 클래스입니다

이것은 내 컨트롤러

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using Web.Repository.Entity; 
using Web.Repository; 

namespace Web.Infrastructure 
{ 
    public static class NewsHelper 
    { 
     public static IEnumerable<News> GetLatestNews() 
     { 
      IEnumerable<News> news; 
      using (var repository = new NewsRepository()) 
      { 
       news = repository.GetLatestNews(); 
      } 
      return news; 
     } 
    } 
} 

:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using Web.Repository.Entity; 
using Web.Models; 
using Web.Infrastructure; 

namespace Web.Controllers 
{ 
    public class HomeController : BaseController 
    { 
     public ActionResult Index() 
     { 
      NewsListModel model = new NewsListModel { News = NewsHelper.GetLatestNews().ToList() }; 
      return View(model); 
     } 
    } 
} 

마지막이 내 모델입니다 : 이것은 내 수업은 최신 뉴스를 얻을 수 있습니다

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Web.Repository.Entity; 

namespace Web.Repository 
{ 
    public class NewsRepository : IDisposable 
    { 
     private WebModelContext _context; 
     private WebModelContext Context 
     { 
      get 
      { 
       if (_context == null) 
        _context = new WebModelContext(); 
       return _context; 
      } 
     } 

     public NewsRepository() { } 

     public IEnumerable<News> GetLatestNews() 
     { 
      return Context.News.Where(news => !news.Deleted).OrderByDescending(news => news.Posted).Take(5).ToList().Select(news => news.GetObject()); 
     } 

     #region Disposing 
     private bool disposed; 

     protected virtual void Dispose(bool disposing) 
     { 
      if (!this.disposed) 
      { 
       if (disposing && _context != null) 
       { 
        _context.Dispose(); 
       } 
      } 
      this.disposed = true; 
     } 

     public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
     } 
     #endregion 

    } 
} 

: 이것은 내 NewsRepository 클래스입니다

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using Web.Repository.Entity; 

namespace Web.Models 
{ 
    public class NewsListModel 
    { 
     public IEnumerable<News> News { get; set; } 
    } 
} 
+0

news = repository.GetLatestNews(); news = repository.GetLatestNews(). ToList()? NewHelper.GetLatestNews()는 아직 실행되지 않은 쿼리를 반환합니다. 이 쿼리는 열거 시작시 실행됩니다. 컨텍스트가 필요하지만 컨텍스트는 메서드를 종료하기 전에 처리됩니다. 이것이 이것이 예외의 이유라고 생각합니다. .ToList()를 추가하면 쿼리 실행이 강제 적용되며 메서드의 쿼리가 아닌 결과가 반환됩니다. – Pawel

답변

0

최신 뉴스가 컬렉션/iqueryable 대신에 사실 목록 이었음을 보장합니다.

관련 문제