0

デタッチされたオブジェクトの変更に関するhttp://msdn.microsoft.com/en-us/library/vstudio/bb896248(v=vs.100).aspxに起因する混乱があります。

これは、デタッチされた状態でオブジェクトを変更した場合、再アタッチするときに、ApplyCurrentValues の代わりに ApplyOriginalValues を使用する必要があることを示しているようです。ただし、これを行うと、オブジェクトを再アタッチした後に変更しない限り、例のようにオブジェクトが更新されないようです。ただし、アタッチ後に変更すると、これらのどちらを使用しても問題ないようです (applyoriginal または applycurrent)。

これが私のコードです:

//this never works
            private void UpdateWithOriginal(Category cat, string name)
            {
                using (TestContext ctx = new TestContext())
                {
                    cat.Name = name;
                    ctx.Categories.Attach(cat);
                    ctx.ApplyOriginalValues("Categories", cat);
                    var state = ctx.ObjectStateManager.GetObjectStateEntry(cat).State;  //never modified state here
                    ctx.SaveChanges();
                }
            }

            //this always works
            private void UpdateWithCurrent(Category cat, string name)
            {
                using (TestContext ctx = new TestContext())
                {
                    ctx.Categories.Attach(cat);
                    cat.Name = name;
                    ctx.ApplyCurrentValues("Categories", cat);
                    var state = ctx.ObjectStateManager.GetObjectStateEntry(cat).State;
                    ctx.SaveChanges();
                }
            }

MSDN リンクが //this が機能しないことを示しているように見える理由を知っている人はいますか?ビットは機能するはずですか?

4

2 に答える 2

1

これはとても簡単に終わりました。なぜ理解できなかったのかわからない。これに対する解決策は次のとおりです。

private void UpdateWithOriginal(Category cat, string name)
        {
            Category updatedObject = new Category()
            {
                CategoryID = cat.CategoryID,
                Name = cat.Name,
                Topics = cat.Topics
            };
            updatedObject.Name = name;
            using (TestContext ctx = new TestContext())
            {
                ctx.Categories.Attach(updatedObject);
                ctx.ApplyOriginalValues("Categories", cat);
                var state = ctx.ObjectStateManager.GetObjectStateEntry(updatedObject).State;  //never modified state here
                ctx.SaveChanges();
            }
        }

私が欠けていたのはこれです。元のオブジェクトと更新されたオブジェクトの 2 つのオブジェクトがあります。デタッチし、WCF サービスに送信し、変更を加え、オブジェクトを送り返し、最後にオブジェクトを更新されたオブジェクトとして再作成します。コンテキストを更新するには、2 つのオブジェクトが必要です。与えられたコードで、updatedObject をコンテキストにアタッチすると、エンティティのステータスは次のようになるからです。

  • 元の値 - 名前 = Bob
  • 現在の値 - 名前 = Bob

違いはないので、 .SAveChanges() は何もしません。更新されたオブジェクトを添付したので、これを引き起こすには ApplyOriginalVALues("Categories",OriginalCategory) を使用する必要があります:

  • 元の値: 名前 = スティーブ
  • 現在の値: 名前 = ボブ

これでオブジェクトが変更され、.SaveChanges() を呼び出すと変更が有効になります。元のオブジェクトをアタッチする場合は、この逆になります (元の値を変更する必要はなく、現在の値を変更する必要があるため、ApplyCurrentVALues() を使用します)。

于 2013-03-02T19:37:24.897 に答える
0

MSDNの記事を読み違えているだけだと思います..

ApplyOriginalValuesの MSDN 定義から:

Copies the scalar values from the supplied object into set of original values for the object in the ObjectContext that has the same key.

ApplyCurrentValuesの MSDN 定義から:

Copies the scalar values from the supplied object into the object in the ObjectContext that has the same key.

これはまさにあなたが見ている動作です。 ApplyOriginalValuesデータベースに戻り、値を更新します。ApplyCurrentValues持っているオブジェクトの値を使用するため、変更を更新できます。

于 2013-03-02T18:42:13.647 に答える