【发布时间】: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 来更新电影。
哪种方法最适合获得最佳灵活性和清晰度?关于附加和更新,我应该了解什么?
【问题讨论】:
-
不,这与我问的大部分问题无关
-
如果您查看官方教程之一,例如Razor Pages 或MVC,您会看到
Edit页面或操作中没有对Attach的调用。只需将对象设置为Modified状态,与Update所做的相同 -
那段代码太不寻常了,我用谷歌搜索了其中的一部分,发现...an exact copy。我认为 Packt 直接销售自己的课程....很奇怪,而不仅仅是在调用
Add或Update之前对Attach的不必要的 调用。我可以建议您从官方和免费教程和课程开始吗?这样您就可以知道您的个人详细信息的最终去向(如果需要的话)。
标签: c# .net entity-framework