簡體   English   中英

實體框架實體中延遲加載時出錯

[英]Error with lazy loading in Entity Framework Entity

我的網頁上有錯誤:

{"The ObjectContext instance has been disposed and can no longer be used for operations that require a connection."}

它在這里出現了我的看法:

@model Service_Monitor_Web_Interface.Models.DashBoardViewModel
...    
=> @Html.DisplayFor(modelItem => item.Service.Name)

這是我的ViewModel類:

    public class DashBoardViewModel
{

    public int NumberOfUsers { get; set; }

    public virtual IEnumerable<ApplicationUser> recentUsers { get; set; }

    public virtual IEnumerable<UserActivityLog> logs { get; set; }

    public virtual IList<Service_Monitor_Domain.Entities.ServiceStatusHistory> serviceStatus { get; set; }

}

這是我班級的控制器:

   public ActionResult Index()
    {
        DashBoardViewModel vm = new DashBoardViewModel();  

        var dbs = new EFServiceStatusHistoryRepository();

        vm.serviceStatus = dbs.GetAllEnabledLatestStatusLog();

        return View(vm);
    }

這是我訪問db的函數:

  public List<ServiceStatusHistory> GetAllEnabledLatestStatusLog()
    {
        List<ServiceStatusHistory> list = null;
        try
        {
            using (var db = new EFDbContext())
            {
                //var results = db.ServiceStatusHistory.Where(h => h.Service.Enabled)
                //                  .OrderByDescending(h => h.Id)
                //                  .GroupBy(h => h.Service.Id)
                //                  .Select(grp => grp.FirstOrDefault());

                var results = db.ServiceStatusHistory
                            .Where(x => x.Service.Enabled)
                            .GroupBy(x => x.Service)
                             .Select(x => x.OrderByDescending(y => y.time).FirstOrDefault());

                list = results.ToList();
            }
            return list;
        }
        catch
        {
            //Error
        }
        return list;
    }

這是我的實體:

    public class ServiceStatusHistory
{
    [Key]
    [Required]
    public int Id { get; set; }

    // Forenkey to service
    [Required]
    public virtual Service Service { get; set; }

    [Required]
    public ServiceStatus Status { get; set; }

    [Required]
    public string Messages { get; set; }

    [Required]
    //Time Logged in the db
    public DateTime time { get; set; }

    [Required]
    //Time the service last called the update method on the client
    public DateTime LastUpdateTime { get; set; }
 }

我認為它與延遲加載有關。 但是在查詢同一個表之前我沒有遇到過這個問題? 然而,這只是一個簡單的選擇查詢。

考慮在GetAllEnabledLatestStatusLog()中加載Service類的“Eager”。 請務必使用System.Data.Entity
using System.Data.Entity var results = db.ServiceStatusHistory .Include("Service") .Where(x => x.Service.Enabled) .GroupBy(x => x.Service) .Select(x => x.OrderByDescending(y => y.time).FirstOrDefault()); 請參閱MSDN加載相關實體

我說這里的問題是在你的查詢中你沒有顯式加載相關的實體(在這種情況下, ServiceStatusHistory.Service ),大概是Lazy Loading默認開啟。

所以稍后當你引用item.Service.Name ,底層的EF類意識到它需要加載這些相關的實體 - 除了關聯的ObjectContext (在這種情況下, EFDbContext )早已被處理掉。

因此,解決此問題的最簡單方法可能是將查詢修改為.Include()相關的Service實體

 var results = db.ServiceStatusHistory
                    .Include("Service")
                    .Where(x => x.Service.Enabled)
                    .GroupBy(x => x.Service)

                    .Select(x => x.OrderByDescending(y => y.time).FirstOrDefault());

或者您可以關閉該查詢的延遲加載

using (var db = new EFDbContext())
{
   db.Configuration.LazyLoadingEnabled=false;
   //use original query here
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM