【问题标题】:What is the difference between Attach and Update?附加和更新有什么区别?
【发布时间】:2020-03-05 13:12:42
【问题描述】:

令我惊讶的是,尽管我花了很长时间寻找答案,但我自己却没有在互联网上找到答案。更令我惊讶的是,人们倾向于比较 Attach to Add,而不是 Update。此外,我发现很少提及实际的 Update 方法,尽管它似乎是所需修改操作的最明显选择。

根据我设法找到的材料,我认为,当您知道对象存在于数据库中的某个位置时,应该使用 Attach。如果您不对其进行更改,则不会对实体执行任何操作,如果您这样做 - 它将被更新。但是,如果从它的声音来看它做同样的事情,你为什么还需要更新呢?

我有这个从 udemy 课程中获取的代码 sn-p。

MovieController.cs

[HttpPut("{id}")]
        public IActionResult ReplaceMovie(long id, [FromBody] Movie m)
        {
            if (ModelState.IsValid)
            {   
               ////
               // logic in question starts here vvv
               ////
                m.MovieId = id;
                if (m.Studio != null && m.Studio.StudioId != 0)
                {
                    context.Attach(m.Studio);
                }
                context.Update(m);
                context.SaveChanges();
                return Ok();
            }
            else
            {
                return BadRequest(ModelState);
            }
        }

但是为什么不直接这样做呢?

m.MovieId = id;
context.Update(m);
context.SaveChanges();
return Ok();

会不会产生相同的结果,因为我们知道如果电影已经分配了工作室,那么它(工作室)存在于数据库中,我们不需要对其应用任何更改?

现在,如果我们对电影和工作室对象应用了一些更改,那么仅在它们各自的控制器中执行更新修改不是更安全吗?例如 - 如果我想更新电影和工作室,那么我会首先调用 StudioController,它会对工作室执行修改操作,然后调用 MovieController 来更新电影。

哪种方法最适合获得最佳灵活性和清晰度?关于附加和更新,我应该了解什么?

【问题讨论】:

  • 这能回答你的问题吗? Why use Attach for update Entity Framework 6?
  • 不,这与我问的大部分问题无关
  • 如果您查看官方教程之一,例如Razor PagesMVC,您会看到Edit 页面或操作中没有对Attach 的调用。只需将对象设置为Modified 状态,与Update 所做的相同
  • 那段代码太不寻常了,我用谷歌搜索了其中的一部分,发现...an exact copy。我认为 Packt 直接销售自己的课程....很奇怪,而不仅仅是在调用AddUpdate 之前对Attach不必要的 调用。我可以建议您从官方和免费教程和课程开始吗?这样您就可以知道您的个人详细信息的最终去向(如果需要的话)。

标签: c# .net entity-framework


【解决方案1】:

.Update 会将实体标记为处于修改状态。更新可用于开始跟踪新实体和现有实体的混合,其中现有实体可能有一些修改。将插入新实体,同时更新现有实体。

.Attach 会将实体标记为处于未更改状态。但是,如果实体具有存储生成的键(例如身份列)并且未设置键值,则实体将处于已添加状态。这意味着,当专门使用存储生成的密钥时,Attach 可用于开始跟踪现有实体未更改的新实体和现有实体的混合。将插入新实体,而不会保存现有实体,除非更新任何必要的 FK 值。

来源信息:

Why use Attach for update Entity Framework 6?

https://blog.oneunicorn.com/2016/11/17/add-attach-update-and-remove-methods-in-ef-core-1-1/

【讨论】:

  • 我相信我现在明白了。 “附加”这个名字对我来说似乎很违反直觉,因为它实际上并没有描述幕后发生的事情。
猜你喜欢
  • 2010-11-18
  • 2014-01-15
  • 2018-10-13
  • 2022-01-13
  • 2020-12-19
  • 1970-01-01
  • 2017-05-03
  • 2016-01-23
  • 1970-01-01
相关资源
最近更新 更多