第99行换成:
ZhaopinDbContext db = new ZhaopinDbContext();
错误消失,页面显示正常了。到这里问题已经解决,是否就应该翻篇了呢。no,这不是一个程序员应有的研究态度。我要知道为什么
ZhaopinDbContext db = new ZhaopinDbContext();可以,而ZhaopinDbContext db = ContextFactory.GetCurrentContext()就有问题了。
通过查看 ContextFactory.GetCurrentContext()类方法。是这样写的。
public class ContextFactory
{
///
/// 获取当前数据上下文
///
///
public static ZhaopinDbContext GetCurrentContext()
{
ZhaopinDbContext _nContext = CallContext.GetData(“ZhaopinDbContext”) as ZhaopinDbContext;
if (_nContext == null)
{
_nContext = new ZhaopinDbContext();
CallContext.SetData(“ZhaopinDbContext”, _nContext);
}
return _nContext;
}
}
这个静态方法先通过CallContext.GetData(“ZhaopinDbContext”)读取事先存储的数据库对象,然后转换为ZhaopinDbContext,转换后再判断_nContext对象是否为null,如果为null,则重新new对象。然后把该对象存储起来,以便随后调用。最后返回ZhaopinDbContext对象。貌似没什么问题。不管了,先替换。
public static ZhaopinDbContext GetCurrentContext()
{
return new ZhaopinDbContext();
}
这样写后,页面调用正常了。这说明,上面的代码是肯定有问题的。那问题在哪里呢,还是看不出来。只能用日志输出中间变量来看了。改造上面的方法位下面的:
public static ZhaopinDbContext GetCurrentContext()
{
ZhaopinDbContext _nContext = CallContext.GetData(“ZhaopinDbContext”) as ZhaopinDbContext;
SXF.Utils.EventLog.WriteLog(“start1”);
if (_nContext == null)
{
_nContext = new ZhaopinDbContext();
CallContext.SetData(“ZhaopinDbContext”, _nContext);
SXF.Utils.EventLog.WriteLog(“start2”);
}
return _nContext;
}
输出的日志是这样得:
2016-09-28 09:49:14 start1
2016-09-28 09:49:14 start2
2016-09-28 09:49:15 start1
2016-09-28 09:49:16 start1
这说明,此方法在页面中被调用了3次。第一次start1,start2都输出了。说明ZhaopinDbContext _nContext = CallContext.GetData(“ZhaopinDbContext”) as ZhaopinDbContext;这句为null,所以进入了下面if条件,重新new了对象。而第二次和第三次调用由于只输出了start1,说明ZhaopinDbContext _nContext = CallContext.GetData(“ZhaopinDbContext”) as ZhaopinDbContext不为空,那怎么不为空仍然会报错:DbContext已被释放呢?只能说明虽然_nContext不为空,但是已经被系统dispose掉了。