1

Entity Framework を使用してレコードを更新しようとしていますが、各プロパティを手動で設定してから変更の保存を呼び出すことは避けたいと考えています。ユーザーがプロパティを変更すると、すべてのプロパティを更新するデータフォームにバインドされたこのクラスのインスタンスがあります。これを使用して私が見ることができる最も良い方法は、コンテキスト内のオブジェクトをデータフォームにバインドされたオブジェクトと同じに設定することですが、これは機能しません。コンテキストからオブジェクトを削除してから、データフォームにバインドされたオブジェクトを追加しようとしましたが、まったく新しいレコードが作成されました (これは予想していましたが、試してみる価値があると判断しました)。レコードが新しい行であるかどうかを検出するために使用される、またはコンテキストオブジェクトをデータバインドされたオブジェクト (同じ pk 値を持つ) に置き換えるという事実を考慮しないために使用されるコンテキスト内に、何らかのタイプのフラグがあると思います。

using (var scope = new TransactionScope())
        {
            try
            {
                using (var context = new CIS_DEVEntities())
                {
                    GangMemberBio bio = context.GangMemberBios.First(P => P.id == this.id);
                    bio = this; //this does not work.
                    context.SaveChanges();
                }
                //If the top code is successfully completed then the transaction will be commited
                //if not this line will be skipped and execution will be given to the catch block
                scope.Complete();
            }
            catch
            {

            }
        }

アイデアの編集 1 wpf ウィンドウ自体にコンテキスト オブジェクトを作成し、このコンテキストから取得した gangmemberbio オブジェクトにデータフォームをバインドできると考えていました。次に、save changes を呼び出すと、他に何もする必要はありません。メモリ内にデータコンテキストを持つのは悪いと聞きました..それとも、using ステートメントのコンテキスト外で使用すると悪いのでしょうか?

4

2 に答える 2

0

編集ページで、最初にデータベースからオブジェクトをロードします。これにより、フォームのフィールドにデータベースからの既存のデータがすべて取り込まれます。フォームが投稿されると、データ オブジェクト モデルのすべての値が設定されます。

于 2013-08-07T05:46:22.883 に答える
0

DbContext各エンティティの状態を内部的に追跡するため、特定のエンティティを追加/更新/削除するかどうかがわかります。エンティティをAdd()コンテキストに追加すると、既に ID を持っている可能性がありますが、デフォルトの状態はAdded(おそらくNew、不明) です。これにより、既存の ID が無視され、新しいレコードがデータベースに挿入されます。

やりたいことは、既存のエンティティを DbContext にアタッチし、それを既存のエンティティとして扱うことを DbContext に知らせて、挿入ではなく更新することです。

これを行うには、特定のエンティティの DbContext で EntityState を設定しModifiedます (既定でNewは、DbContext にエンティティを追加するときです)。

次のようなことを試してください:

using (var context = new CIS_DEVEntities())
{
    context.Entry(this).State = EntityState.Modified;
    context.SaveChanges();
}
于 2013-08-07T05:51:18.673 に答える