2012-04-11 56 views
0

我想從我的數據庫中獲取最新消息,但是我一直收到此錯誤:The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.錯誤發生在NewsEntity.GetObject()方法中。我嘗試添加ToList,啓用LazyLoading,重新排序我創建對象集的方式。我已經拿出了作者和圖標的加載和工作,但我需要他們:)感謝您的任何幫助。最新消息,ObjectContext實例已處理

這裏是我NewsEntity類:

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 
      }; 
     } 
    } 
} 

這是我NewsObject類(用於數據傳輸):

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; } 
    } 
} 

這是我的數據庫上下文類:

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; } 
     } 
} 

}

這是我的NewsRepository類:

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 

    } 
} 

這是我的同班同學得到的最新消息:

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.Web; 
using Web.Repository.Entity; 

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

它會工作,如果你改變新聞= repository.GetLatestNews(); line to news = repository.GetLatestNews()。ToList()? NewHelper.GetLatestNews()返回尚未執行的查詢。該查詢將在您開始枚舉時執行。它需要一個上下文,但上下文在離開該方法之前處理。我相信這是例外的原因。添加.ToList()將強制執行查詢,並且您將返回結果而不是方法中的查詢。 – Pawel 2012-04-16 05:58:00

回答

0

我解決了這個問題確保最新消息事實上是一個列表,而不是一個集合/ iqueryable