0

オブジェクトを返す 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() {}が、まだ奇妙な競合が発生しているため、特に SD​​F が同じ競合を反映していない場合に、なぜ時々競合が発生するのか混乱しています。

4

1 に答える 1

0

私の場合、それはいくつかの要因が組み合わさった結果であることがわかりました.私のエンティティには、主キーの一部を構成しないプロパティがなく、列にもありませんでしたIsVersion = true. UpdateCheck = UpdateCheck.Neverタイミングの問題があったため、列が古い値と予想されていたものと一致した場合にのみ更新しようとしたようです。

于 2012-06-25T12:59:04.397 に答える