Asp.net mvc 最新消息,ObjectContext实例已被释放

Asp.net mvc 最新消息,ObjectContext实例已被释放,asp.net-mvc,objectcontext,Asp.net Mvc,Objectcontext,我试图从我的数据库中获取最新消息,但我一直遇到这样的错误:ObjectContext实例已被释放,无法再用于需要连接的操作。错误发生在NewsEntity.GetObject方法上。我已经尝试添加ToList,启用LazyLoading,按照创建对象集的方式重新排序。我已经取出了作者和图标的加载,这很有效,但我需要它们:谢谢你的帮助 这是我的NewsEntity类: using System; using System.Collections.Generic; using System.Linq

我试图从我的数据库中获取最新消息,但我一直遇到这样的错误:ObjectContext实例已被释放,无法再用于需要连接的操作。错误发生在NewsEntity.GetObject方法上。我已经尝试添加ToList,启用LazyLoading,按照创建对象集的方式重新排序。我已经取出了作者和图标的加载,这很有效,但我需要它们:谢谢你的帮助

这是我的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
            };
        }
    }
}
这是我的数据库上下文类:

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

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

我通过确保最新新闻实际上是一个列表而不是一个集合/iqueryable解决了这个问题。

如果更改news=repository.GetLatestNews;新闻行=repository.GetLatestNews.ToList?GetLatestNews返回一个尚未执行的查询。开始枚举时将执行此查询。它需要一个上下文,但上下文在离开方法之前被释放。我相信这就是例外的原因。Adding.ToList将强制执行查询,您将返回结果,而不是方法中的查询。
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; }
    }
}