[英]Can't access related data after disposal of DataContext in Linq to SQL
[英]LINQ Datacontext Disposal Issues
我得到一個Cannot access object: DataContext after it's been disposed
在下面的DAL方法之后。 我以為我可以在那里打電話處理。 result
是一個IEnumurable
,我認為它是IQueryable
導致這些問題。
我究竟做錯了什么? 我應該如何處理我的DataContext
。 有沒有更好的東西返回DataTable
? 這是一個指向SQL 2005的桌面應用程序。
導致此錯誤的示例方法 - >
public static DataTable GetEnrolledMembers(Guid workerID)
{
var DB = CmoDataContext.Create();
var AllEnrollees = from enrollment in DB.tblCMOEnrollments
where enrollment.CMOSocialWorkerID == workerID || enrollment.CMONurseID == workerID
join supportWorker in DB.tblSupportWorkers on enrollment.EconomicSupportWorkerID
equals supportWorker.SupportWorkerID into workerGroup
from worker in workerGroup.DefaultIfEmpty()
select
new
{
enrollment.ClientID,
enrollment.CMONurseID,
enrollment.CMOSocialWorkerID,
enrollment.EnrollmentDate,
enrollment.DisenrollmentDate,
ESFirstName = worker.FirstName,
ESLastName = worker.LastName,
ESPhone = worker.Phone
};
var result = from enrollee in AllEnrollees.AsEnumerable()
where (enrollee.DisenrollmentDate == null || enrollee.DisenrollmentDate > DateTime.Now)
//let memberName = BLLConnect.MemberName(enrollee.ClientID)
let lastName = BLLConnect.MemberLastName(enrollee.ClientID)
let firstName = BLLConnect.MemberFirstName(enrollee.ClientID)
orderby enrollee.DisenrollmentDate ascending, lastName ascending
select
new
{
enrollee.ClientID,
//MemberName = memberName,
LastName = lastName,
FirstName = firstName,
NurseName = BLLAspnetdb.NurseName(enrollee.CMONurseID),
SocialWorkerName = BLLAspnetdb.SocialWorkerName(enrollee.CMOSocialWorkerID),
enrollee.EnrollmentDate,
enrollee.DisenrollmentDate,
ESWorkerName = enrollee.ESFirstName + " " + enrollee.ESLastName,
enrollee.ESPhone
};
DB.Dispose();
return result.CopyLinqToDataTable();
}
我創建DataContext的分部類 - >
partial class CmoDataContext
{
public static bool IsDisconnectedUser
{
get
{
return Settings.Default.IsDisconnectedUser;
}
}
public static CmoDataContext Create()
{
var cs = IsDisconnectedUser ? Settings.Default.CMOConnectionString : Settings.Default.Central_CMOConnectionString;
return new CmoDataContext(cs);
}
在處理DataContext之后,您正在調用CopyLinqToDataTable
。 由於LINQ使用延遲執行,它僅當執行該查詢result
被列舉在DataContext設置之后。
您應該將DataContext放在包含return
語句的using
塊中。
這將在調用CopyLinqToDataTable
之后CopyLinqToDataTable
DataContext,從而避免此問題。
例如:
using(var DB = CmoDataContext.Create()) {
//Execute queries
return result.CopyLinqToDataTable();
}
using
語句生成一個finally
塊,在using
塊的末尾處理DataContext。 (即使拋出異常)
在調用Dispose
之前,您應該在查詢中使用類似ToList
你不能這樣做嗎?
...
DataTable dt = result.CopyLinqToDataTable();
DB.Dispose();
return dt;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.