我有一个WCF层到一个非常复杂的数据库,我使用LINQ to Entities读取。最近,出现了一个奇怪的错误。我在执行查询时得到空引用,但有时只是(数据库中的数据没有改变)。我有两个下面描述的一般情况,它是一个或另一个失败。如果我重新启动访问服务的站点以便重新初始化连接,则角色会切换。现在另一种情况是失败,而第一种情况起作用。所以..我很困惑。有没有人想到什么?
案例1:
string code = "xxx";
int version = 1;
Language lang = Language.en;
var languages = this.uc.MainTable
.Expand(a => a.Program.Area)
.Expand(a => a.Plang)
.Expand(a => a.Lang)
.Where(a =>
a.Program.Code.Equals(code, StringComparison.OrdinalIgnoreCase)
&& a.Lang != null
&& a.Program.Version == version)
.ToList();
var language = languages.Where(a => a.Lang.LangID == (int)lang).SingleOrDefault();
在上面的情况中,枚举language
时,a.Lang
为null,并且方法失败。同样,这只是有时候。使用完全相同的输入参数和数据库内容,查询在重新初始化服务连接后再次起作用。当第一个案例成功时,第二个案例似乎失败了,反之亦然。另一种情况是:
案例2:
Language lang = Language.en;
var programs = this.uc.SomeTable
.Expand(a => a.Program)
.Expand(a => a.Plang)
.Expand(a => a.Program.Level)
.Where(a =>
a.Program.Version == 1
&& a.LangID == (int)lang
&& a.Program.Occasion.Any(b => b.StatusID != 3));
programs = programs.Where(a => a.Program.Occasion.Any(b => b.Date == "2010-01-01"));
枚举programs
时,最后一行中的a.Program.Occasion
为空并导致空引用。尽管数据库和参数相同,但这是间歇性的。
我很感激甚至可能导致这种情况的任何想法...
答案 0 :(得分:1)
这通常是由DataServiceContext.MergeOption引起的。默认设置意味着客户端在第一次查询后永远不会更新实体。这意味着即使在查询中展开了导航属性,其他查询也不会填充导航属性。修复方法是将MergeOption设置为OverwriteChanges。