在搜索通过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查询的方法。我也冲浪,但没有找到我的问题的答案。请给我提供解释或一些好的数学知识。
如果您知道数据库中已经存在一个实体,但是上下文当前尚未跟踪该实体(在您的情况下是正确的),则可以使用Attach
on方法告诉上下文跟踪该实体DbSet
。因此,总而言之,Attach
方法是在上下文中跟踪实体并将其状态更改为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();
何时应将实体的状态显式更改为已修改?
当您拥有一个数据库中已经知道的实体,但是那时已经进行了更改。您的示例相同的情况
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句