1

LINQ to Entities を使用して読み取る非常に複雑なデータベースへの WCF レイヤーがあります。しかし、最近、奇妙なエラーが発生しました。クエリの実行時に null 参照を取得しますが、たまにしかありません (データベース内のデータは変更されません)。以下に説明する2つの一般的なケースがあり、それはどちらかが失敗するか、もう一方が失敗するかのどちらかです。接続が再初期化されるようにサービスにアクセスするサイトを再起動すると、役割が切り替わります。最初のケースは機能しますが、もう一方のケースは失敗しています。だから..私はかなり混乱しています。何か思いつく人はいますか?

ケース 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 番目のケースは失敗するように見え、その逆も同様です。他のケースは次のとおりです。

ケース 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れると、最後の行が null になり、null 参照が発生します。繰り返しますが、これは断続的ですが、データベースとパラメーターは同じです。

何が原因なのか少しでもわかるとありがたいです...

4

1 に答える 1

1

ここで回答: http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/9fb8648a-fb4f-4ebd-ad5a-c911cd00a812

これは通常、DataServiceContext.MergeOption が原因です。デフォルト設定は、クライアントが最初のクエリの後にエンティティを更新しないことを意味します。つまり、追加のクエリは、クエリで展開された場合でも、ナビゲーション プロパティを設定しません。修正は、MergeOption を OverwriteChanges に設定することです。

于 2012-04-16T18:06:16.937 に答える