我有一个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);
答案 0 :(得分:1)
我怀疑这与Linq处理查询有关。我猜测基于我过去读过的文章,但我认为您的查询是懒惰执行的 - 查询是从首次使用枚举器(第一次MoveNext
调用)的角度打开的,并且在枚举完成之前不会关闭。
如果您控制枚举,则可以确保枚举器完成并查看是否有任何区别。或者,更有可能的是,某个地方的配置可能会控制查询的运行方式,但这超出了我所看到的范围。