0

私はEFのA **で痛みを経験しており、Googleによると、この問題を抱えているのは私だけではありません。EF から取得したオブジェクトのリストがあり、このリストを項目コントロールの DataContext (WPF) として設定します。「using」ブロックの後、コンテキストが破棄されるため、変更を保存したい場合は、同じ ID を持つ新しいクエリとオブジェクトを作成する必要があります。Context にアタッチしようとしましたが、変更を保存しようとしましたが、保存されませんでした。

いくつかのことを試した人もいますが、この問題に対する便利でスマートな解決策を知っている人はいますか?

試してみましAttach()た ,AttachTo()何もうまくいきませんでした

PSそれはEF 4.0です

編集済み - 解決済み

添付と保存の間に次のコード行を追加すると、EF 4.0 のすべてが解決されました

_context.ObjectStateManager.ChangeObjectState(modifiedEntity, System.Data.EntityState.Modified);

EF 4.1で

_context.Entry(modifiedEntity).State = System.Data.EntityState.Modified;
4

2 に答える 2

1

Attach()Entity Framework オブジェクトの を newにするDbContextと、State EntityState.Unchangedで入力されます。これは、オブジェクトが最初に DB から (別のコンテキストで) フェッチされてから、オブジェクトのプロパティが実際に変更されたかどうかに関係なく発生します。

現在の DbContext の外部で発生した変更について EF に通知するには、 を呼び出す前にオブジェクトの State をEntityState.ModifiedDbContext.SaveChanges()に設定するだけです。

        Foo foo=null;
        using (var db = new MyContext())
        {
            db.Foos.Add( new Foo { MyValue = OLD_VALUE } );
            db.SaveChanges();   // foo written to DB with MyValue = OLD_VALUE

            foo = db.Foos.FirstOrDefault(); // grab foo
        }

        // leave context and update foo...
        foo.MyValue = NEW_VALUE;

        using (var db = new MyContext())
        {
            db.Foos.Attach(foo);    // foo is attached in the 'unchanged' state...
            db.SaveChanges();       // ...so this statement has no effect

            // At this point, db.Foos.FirstOrDefault().MyValue will be NEW_VALUE, yet
            // the "real" value of the object in the DB is OLD_VALUE.

            db.Entry(foo).State = EntityState.Modified; // setting foo to "Modified" will cause...
            db.SaveChanges();                           // ...foo to be written out with NEW_VALUE
        }
于 2013-06-06T13:45:29.023 に答える