[英]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.