オブジェクトを返す Web サービスと、マークアップした候補キーがあります。
[Column(IsPrimaryKey = true)]
public int EventId { get; set; }
Web サービスからデータを読み込んでも問題ありませんが、次のように、新しいアイテムと更新されたアイテムを繰り返し処理して SQL CE データベースに配置し、キャッシュとして機能させます。
foreach (var e in results)
{
var ev = (from evt in context.Events where evt.EventId == e.EventId select evt).FirstOrDefault();
if (ev == null)
{
// Brand new
context.Events.InsertOnSubmit(e);
}
else
{
// Update data
...
}
}
何らかの理由で、イベントが真新しいと見なされることがありますが、次の処理中に例外がスローされますInsertOnSubmit
。
System.InvalidOperationException が処理されませんでした
既存のエンティティを追加することはできません。
Windows Phone Power Tools を使用してエミュレーターからデータベースを取得し、データベースを Visual Studio にロードしました。主キーの競合する値はないように見えますが、それを意味する例外が発生するのはなぜですか?競合があり、デバッガーはクロススレッドの問題がないことを示していますか?
編集
私が見つけた 1 つのことは、私のエンティティにはEquals()
、主キーをカバーしていないオーバーライドがあり (自然キーで比較を行った)、Web サービスには、候補キーとして文書化されているものに関する 2 つのレコードがあるようです。 .
主キーも考慮するように Equals メソッドを調整すると、例外が a に変更され、次のことがわかりますSqlCeException
。
一意のインデックスに重複する値を挿入することはできません。[ テーブル名 = SpecialEvent、制約名 = PK_SpecialEvent ]
主キーはまだ複製されていませんが、さらに混乱します (特に、そのタイプの例外は簡単にキャッチできないため)。
EDIT2
更新を実行するコードを使用してみましたlock() {}
が、まだ奇妙な競合が発生しているため、特に SDF が同じ競合を反映していない場合に、なぜ時々競合が発生するのか混乱しています。