为什么使用Attach for update Entity Framework 6?

Vit*_*nko 10 c# entity-framework crud

在搜索通过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();
    }
}
Run Code Online (Sandbox Code Playgroud)

假设我们在数据库中有一个id = 1的记录.在这种情况下,上面的代码将更新记录(将值设置为5).问题是为什么它有效?然后我为什么要使用Attach()?据我所知,记录并未以任何方式附加到上下文中.我读到的有关章节本书和教程,但他们使用2查询的方法.我也上了SO,但没有找到我的问题的答案.请帮我解释一下或好一些好的东西.

oct*_*ccl 25

如果您知道某个实体已经存在于数据库中但当前没有被上下文跟踪 - 在您的情况下也是如此 - 那么您可以告诉上下文使用该Attach方法跟踪实体DbSet.因此总结一下,什么Attach方法在上下文中跟踪实体并将其状态更改为Unchanged.在此之后修改属性时,跟踪更改将更改其状态Modified为您.在上面公开的情况下,您明确告知状态,Modified但也要将实体附加到您的上下文.你可以在这篇文章中找到详细的解释.

Attach什么时候应该使用方法?

如果您知道某个实体已存在于数据库中但想要进行一些更改:

var entity= new Entity{id=1};
context.YourDbSet.Attach(entity); 

// Do some change...  
entity.value=5;

context.SaveChanges(); 
Run Code Online (Sandbox Code Playgroud)

这是一样的:

 context.Entry(entity).State = EntityState.Unchanged; 

// Do some change... 
entity.value=5; 

context.SaveChanges(); 
Run Code Online (Sandbox Code Playgroud)

什么时候应该明确地将实体的状态更改为修改?

如果您知道某个实体已存在于数据库中,但已经进行了更改.您的示例的相同场景

  • @VitaliiIsaenko 为什么要跟踪新对象?因为当您调用 `ctx.Entry(record)` 时,DbContext 将自动查找或创建您的实体并将其附加到上下文。 (2认同)
  • 确切地说,在这种情况下您不需要使用“Attach”方法。 (2认同)