c# - 为什么使用 Attach 更新 Entity Framework 6?

标签 c# entity-framework crud

在搜索通过 EF 执行 CRUD 操作的最佳实践时,我注意到强烈建议在更新实体之前使用 Attach()Find() 方法.它运行良好,根据 EF 文档,这些方法将实体提取到对我来说非常清楚的上下文中。但是下面的代码让我很困惑

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()?据我了解,该记录与上下文没有任何关联。我看了this的相关章节书和the tutorial但他们使用 2-query-approach。我也冲浪了,但没有找到我的问题的答案。请帮我解释一下或一些好的数学。

最佳答案

如果您知道一个实体已存在于数据库中,但当前未被上下文跟踪 - 在您的情况下是这样 - 那么您可以使用 Attach 告诉上下文跟踪该实体 DbSet 上的方法。 所以总而言之,Attach 方法所做的是跟踪上下文中的实体并将其状态更改为Unchanged。在此之后修改属性时,跟踪更改会将其状态更改为 Modified 。 在您在上面公开的情况下,您明确地告诉状态是 Modified 并且还要将实体附加到您的上下文。您可以在此 post 中找到详细说明.

什么时候应该使用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(); 

什么时候应该将实体的状态显式更改为已修改?

当您知道一个实体已经存在于数据库中但已经进行了更改时。您的示例的相同场景

关于c# - 为什么使用 Attach 更新 Entity Framework 6?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41025338/

相关文章:

c# - 这里的 "this"关键字是什么意思?

c# - 如何将数据表传递给Javascript

entity-framework - 为什么 DbContext 实现了 IObjectContextAdapter 但没有公共(public) ObjectContext 属性

javascript - React CRUD 应用程序中出现错误 : TypeError: Cannot destructure property 'id' of 'this.props.event' as it is undefined

php - 学说 :generate:crud for Entites outside a bundle

c# - 缺少使用 BingMapsRESTToolkit 获取距离的最后一步

c# - 在保存到数据库之前检查类是否为新实例或至少填充一次属性

c# - ObjectContext 实例已被释放,不能再用于需要连接的操作。在引用表中

c# - 将 ASP.NET Identity 集成到现有的 DbContext

ruby-on-rails - 销毁操作中的重定向无法正常工作