C# 实体框架修改分离对象

C# 实体框架修改分离对象,c#,entity-framework,C#,Entity Framework,关于修改分离的对象,我有一些困惑 这似乎表明如果我在分离状态下修改对象,当我重新连接时,我应该使用ApplyOriginalValues而不是ApplyCurrentValues。但是,当我这样做时,它似乎永远不会像示例中那样更新对象,除非我在重新附加对象后修改它。 但是,如果我在附加后进行修改,那么使用哪一个(applyoriginal或applycurrent)似乎无关紧要 这是我的密码: //this never works private void UpdateW

关于修改分离的对象,我有一些困惑

这似乎表明如果我在分离状态下修改对象,当我重新连接时,我应该使用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链接似乎表明//这永远不起作用,bit应该起作用吗?

我想你只是误读了MSDN文章

根据MSDN的定义:

将所提供对象的标量值复制到ObjectContext中具有相同键的对象的原始值集中。

根据MSDN的定义:

将标量值从提供的对象复制到ObjectContext中具有相同键的对象中。


这正是你看到的行为
ApplyOriginalValues
返回数据库并更新值
ApplyCurrentValues
使用对象中的值,因此可以更新更改。

这非常简单。我不知道为什么我不明白。以下是解决此问题的方法:

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服务、进行更改、将对象发送回,然后在您的端将对象重新创建为更新的对象。现在,为了更新您的上下文,您需要两个对象,因为对于给定的代码,如果您将UpdateObject附加到上下文中,则实体的状态如下:

  • 原始值-Name=Bob
  • 当前值-Name=Bob
没有什么不同,因此.SAveChanges()不会做任何事情。由于附加了更新的对象,因此必须使用ApplyOriginalVAlues(“类别”,OriginalCategory)导致以下情况:

  • 原始值:Name=Steve
  • 当前值:Name=Bob

现在您有了一个已修改的对象,当您调用.SaveChanges()时,更改将生效。如果附加原始对象,则情况正好相反(不需要修改原始值,而需要修改当前值,因此使用ApplyCurrentVAlues())。

Thx获取信息。我会再检查一遍的。