0

我有一些困惑,源于这个http://msdn.microsoft.com/en-us/library/vstudio/bb896248(v=vs.100).aspx关于修改分离的对象。

这似乎表明如果我修改处于分离状态的对象,当我重新附加时,我应该使用 ApplyOriginalValues 而不是 ApplyCurrentValues。但是,当我这样做时,它似乎永远不会像示例中那样更新对象,除非我在重新附加对象后修改它。但是,如果我在附加后进行修改,那么我使用哪一个(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();
            }
        }

我缺少的是这个。您有两个对象,一个原始对象和一个更新对象。您分离,将其发送到 WCF 服务,进行更改,将对象发回,最后您将对象重新创建为更新的对象。现在为了更新您的上下文,您需要两个对象,因为使用给定的代码,如果您将更新的对象附加到您的上下文,您的实体的状态是这样的:

  • 原始值 - 姓名 = Bob
  • 当前值 - 姓名 = Bob

没有什么不同,所以 .SAveChanges() 不会做任何事情。由于您附加了更新的对象,因此您必须使用 ApplyOriginalVALues("Categories",OriginalCategory) 来导致:

  • 原始值:名称 = Steve
  • 当前值:姓名 = Bob

现在您有一个修改过的对象,当您调用 .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 回答