0

データベースから最新ニュースを取得しようとしていますが、このエラーThe ObjectContext instance has been disposed and can no longer be used for operations that require a connection.が発生し続けます。エラーは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
            };
        }
    }
}

これは私の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; }
    }
}
4

1 に答える 1

0

最新のニュースがコレクション/iqueryableではなく実際にリストであることを確認することでこれを修正しました

于 2012-07-24T12:38:08.833 に答える