0

DB から取得した .NET 4 エンティティ フレームワーク オブジェクトがいくつかあり、それらを XML にシリアル化します。次に、WPF アプリを終了します (メモリをクリアします)。次に、WPF アプリを再起動し、それらを読み取り (逆シリアル化) して List<> に戻しますが、それらを EF コンテキストにアタッチすることはありません。オブジェクト コンテキストで SaveChanges() を呼び出すと、重複するレコードが作成されますが、逆シリアル化されたものをコンテキストにアタッチしたことがないため、新しいコンテキストがレコードのコピーを作成する理由がわかりません。これは自己追跡エンティティhttp://msdn.microsoft.com/en-us/library/ff407090.aspxと関係がありますか?

ここにレビューがあります...

アプリを起動

オブジェクトを ObjectSet.ToList() _cachedRates にクエリします

IQueryable<Rate> query = DB.EF.Rates.Where({some predicates});

if (query != null && query.Count() > 0)
    _cachedRates = query.ToList();

XML にシリアライズ

XmlSerializer serializer = new XmlSerializer(_cachedRates.GetType());
TextWriter textWriter = new StreamWriter(saveDialog.FileName);
serializer.Serialize(textWriter, _cachedRates);
textWriter.Close();

アプリを閉じる

...{後で}...

アプリを再起動する

XML ファイルからオブジェクトをロードします。オブジェクトは、どのコンテキストに対しても Attach() または AddObject() されません。

if (openDialog.ShowDialog().Value)
{
    _cachedRates = null;

    XmlSerializer deserializer = new XmlSerializer(typeof(List<Rate>));
    TextReader textReader = new StreamReader(openDialog.FileName);
    _cachedRates = (List<Rate>)deserializer.Deserialize(textReader);
    textReader.Close();
}

ユーザーが「保存」ボタンを押すと、コンテキストで .SaveChanges() が呼び出されます

問題: テーブルに一致する行が 2 倍になりました

4

1 に答える 1

0

オブジェクトをあるコンテキストからシリアライズしてから、別のコンテキストでオブジェクトにデシリアライズしているため、この動作が見られます。オブジェクト/アイテムを現在のコンテキストから切り離した後、別のコンテキストを開いて現在のコンテキストに再接続しないと、コンテキストはそれを新しいオブジェクトと見なします。このシナリオの 1 つのオプションは、コンテキストで .SaveChanges() メソッドが呼び出される前にコンテキストからそれらの料金を取得するためにキャッシュした料金の ID を使用し、次にコンテキストからそれらの料金を操作することです。キャッシュされたオブジェクト。JSONを介して複雑なモデルを送信しているため、現在のMVCアプリケーションでこれと非常によく似たことを行う必要があり、子コレクションを適切に保存したい場合は、親オブジェクトをコピーして、空の子コレクションを持つコンテキストにアタッチする必要があります。次に、JSON オブジェクトの各プロパティの子オブジェクトをコンテキストから直接クエリし、保存する前に、コンテキストからのオブジェクトをアタッチされたオブジェクトの子オブジェクトに割り当てます。これは私にはうまくいくようです。逆シリアル化された JSON オブジェクトを子と一緒に保存しようとすると、データベースに子の行が重複してしまいます。

于 2011-07-27T02:30:35.250 に答える