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