【问题标题】:How to attach an EF Object to a new Context in c#如何在 C# 中将 EF 对象附加到新上下文
【发布时间】:2013-06-06 12:51:55
【问题描述】:

我正在经历 EF 的 A** 的痛苦,根据谷歌,我不是唯一一个遇到这个问题的人。我有一个从 EF 获得的对象列表,然后我将此列表设置为 itemscontrol 的 DataContext (WPF)。因为,在“使用”块之后,上下文被破坏了,当我希望保存更改时,我必须使用相同的 ID 进行新的查询和对象。我尝试将其附加到上下文,我尝试保存更改,但它们没有被存储。

有些人已经尝试了几件事,但也许有人知道解决这个问题的方便和聪明的解决方案吗?

我试过Attach()AttachTo(),没有任何效果

附:这是 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;

【问题讨论】:

    标签: c# wpf entity-framework datacontext


    【解决方案1】:

    当您对新的DbContext 执行实体框架对象的Attach() 时,它会以EntityState.Unchanged 状态输入。无论对象的属性是否实际上已更改,因为它最初是从数据库中获取的(在不同的上下文中),都会发生这种情况。

    要告诉 EF 当前 DbContext 之外发生的更改,您只需在调用 DbContext.SaveChanges() 之前将对象的状态设置为 EntityState.Modified

            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
            }
    

    【讨论】:

    • 这适用于 EF 4.1 在 EF 4.0 上,您必须以不同的方式进行操作,因为没有“进入”方法。无论如何,这是解决方案
    【解决方案2】:

    老实说,这有点痛苦。这是我在遇到类似问题时写的关于附加修改对象的帖子,还有其他问题,也许它有帮助...

    Entity Framework Modify Detached Object

    所以,为了避免刺激,我通常会这样做:

    public ActionResult Edit(Category cat)
    {
      //cat is the modified object
      using(MyEFEntities db = new MyEFEntities())
      {
        var dbCategory = db.Categories.FirstOrDefault(o => o.ID == cat.ID);
        dbCategory.Description = cat.Description.
        dbCategory.Value = cat.Value;
        db.SaveChanges();
      }
    }
    

    所以,如您所见,我只是在当前上下文中获取对象,修改它,然后保存,而不是搞乱附加等。将修改后的对象正确地附加到上下文然后保存确实可能更好,但我对这样做(对我来说)是多么不明显感到恼火。

    也许其他人会为您提供更正确的解决方案。

    祝你好运。

    【讨论】:

    • 哦,不。如果我每次都必须这样做,这将是痛苦的。
    • 试一试stackoverflow.com/questions/4413872/…,取决于你的EF版本,也许就像将状态设置为修改一样简单。值得一试。
    • 这是我找到解决方案的地方。由于我使用的是 EF4.0,我不得不以旧方式进行操作。 ;) thnx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2018-04-03
    相关资源
    最近更新 更多