[英]Why use Attach for update Entity Framework 6?
在搜索通过EF执行CRUD操作的最佳实践时,我注意到强烈建议在更新实体之前使用Attach()
或Find()
方法。 它工作得很好,根据EF文档,这些方法将实体提取到上下文中,这对我来说非常清楚。 但是followind代码让我很困惑
public void Update(object entity)
{
Record record = new Record() {
id = 1,
value = 5
};
using (SomeContext ctx = new SomeContext())
{
ctx.Entry(record).State = EntityState.Modified;
ctx.SaveChanges();
}
}
假设我们在数据库中有一个id = 1的记录。 在这种情况下,上面的代码将更新记录(将值设置为5)。 问题是为什么它有效? 然后我为什么要使用Attach()
? 据我所知,记录并未以任何方式附加到上下文中。 我读到的有关章节这本书和教程 ,但他们使用2查询的方法。 我也上了SO,但没有找到我的问题的答案。 请帮我解释一下或好一些好的东西。
如果您知道某个实体已经存在于数据库中但当前没有被上下文跟踪 - 在您的情况下也是如此 - 那么您可以告诉上下文使用DbSet
上的Attach
方法跟踪实体。 因此总结一下Attach
方法所做的是跟踪上下文中的实体并将其状态Unchanged
为Unchanged
。 在此之后修改属性时,跟踪更改会将其状态更改为“已Modified
”。 在上面公开的情况下,您明确告知状态是已Modified
但也要将实体附加到您的上下文。 你可以在这篇文章中找到详细的解释。
什么时候应该使用Attach
方法?
如果您知道某个实体已存在于数据库中但想要进行一些更改:
var entity= new Entity{id=1};
context.YourDbSet.Attach(entity);
// Do some change...
entity.value=5;
context.SaveChanges();
这是一样的:
context.Entry(entity).State = EntityState.Unchanged;
// Do some change...
entity.value=5;
context.SaveChanges();
什么时候应该明确地将实体的状态更改为修改?
如果您知道某个实体已存在于数据库中,但已经进行了更改。 您的示例的相同场景
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.