Ref*_*din 2 .net c# datacontext linq-to-sql
我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();
}
Run Code Online (Sandbox Code Playgroud)
我创建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);
}
Run Code Online (Sandbox Code Playgroud)
您CopyLinqToDataTable
在处理DataContext后正在调用.由于LINQ使用延迟执行,因此它只在result
枚举DataContext后执行查询.
您应该将DataContext放在using
包含该return
语句的块中.
这将在调用后释放DataContext CopyLinqToDataTable
,避免出现问题.
例如:
using(var DB = CmoDataContext.Create()) {
//Execute queries
return result.CopyLinqToDataTable();
}
Run Code Online (Sandbox Code Playgroud)
该using
语句生成一个finally
块,该using
块在块的末尾处理DataContext .(即使抛出异常)
归档时间: |
|
查看次数: |
1353 次 |
最近记录: |