【发布时间】:2010-05-24 22:31:39
【问题描述】:
我有一个 n 层的 asp.net 应用程序,它将一个对象从我的 DAL 返回到 BAL,如下所示:
public IEnumerable<SourceKey> Get(SourceKey sk)
{
var query = from SourceKey in _dataContext.SourceKeys
select SourceKey;
if (sk.sourceKey1 != null)
{
query = from SourceKey in query
where SourceKey.sourceKey1 == sk.sourceKey1
select SourceKey;
}
return query.AsEnumerable();
}
此结果通过我的业务层并到达 UI 层以显示给最终用户。我不会延迟加载以防止在我的应用程序的其他层执行查询。
我在 DAL 中创建了另一个函数来删除对象:
public void Delete(SourceKey sk)
{
try
{
_dataContext.DeleteObject(sk);
_dataContext.SaveChanges();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message + " " + ex.StackTrace + " " + ex.InnerException);
}
}
当我在调用“Get”函数后尝试调用“Delete”时,收到此错误:
不允许新交易,因为 还有其他线程在运行 会话
这是一个 ASP.Net 应用程序。我的 DAL 包含一个实体数据模型。我拥有上述函数的类共享相同的_dataContext,它在我的构造函数中实例化。我的猜测是阅读器仍然从“获取”功能打开并且没有关闭。如何关闭它?
在我的 UI 层中,我循环遍历结果并尝试像这样删除它们:
foreach(SourceKey sk in skm.Get(new SourceKey()))
{
Debug.WriteLine(sk.sourceKey1);
skm.Delete(sk);
}
编辑
此行出现错误:
_dataContext.DeleteObject(sk);
【问题讨论】:
标签: .net entity-framework multithreading savechanges objectcontext