2011-03-14 50 views
1

当在LinqToSql DataContext上设置LoadOptions属性时,如果上下文已经从另一个查询返回结果,则会发生异常“在从结果返回结果后不允许设置加载选项查询“被抛出。如何判断LinqToSql DataContext以前是否返回结果

我想知道的是,有没有办法检查DataContext对象,看看它是否已经返回以前的查询结果?

回答

0

您通常不会将DataContext保留足够长的时间以解决此问题。该类的设计在创建和销毁方面很便宜,因此通常会为单个工作单元创建一个新的DataContext对象,然后处理它。喜欢的东西:

using(var db = new TestDataContext()) 
{ 
    db.LoadOptions = CreateLoadOptions(); 
    var p = (from person in db.Persons 
      where <someCondition> 
      select p) 
      .First(); 

    p.SomeProperty = someValue; 
    db.SubmitChanges(); 
} 

我认识到,在技术上不回答你的问题,但我不知道的方法来检查是否查询已在自己设置一个标志的DC短执行码。

+0

我会尽量先发现异常,如果不行的话,我会按照你的建议把工作单元分成小块,谢谢。 – Simon 2011-03-14 02:27:28

+0

这不是你遇到的唯一问题,如果你将DataContext放在太长的时间内,尽管远离它。您应该真的重构代码以根据需要创建这些上下文对象。 – 2011-03-14 02:46:15

1

好吧,它不是DataContext,而是返回结果本身,而不是查询。查询是延迟加载的,这意味着在实际需要结果之前他们不会访问数据库。例如,调用.ToList()或循环遍历结果。

仍然不完全回答你的问题,但我建议在DataContext的构造函数中设置LoadOptions - 或者在实例化后立即设置。这应该消除这个谜团。

0

我有同样的问题....我发现避免异常(因为你甚至不能重置配置)的唯一方法是检查LoadOptions是否为null。如果它是空的,我设置新的选项,如果它不是我创建一个新的DataContext实例。

+0

我实际上已经在做空检查。我认为即使LoadOptions为null,在我的情况下,因为存储过程被称为第一个查询,所以仍然抛出异常。 – Simon 2011-03-14 02:19:31

相关问题