为什么要使用附加更新 Entity Framework 6?
Why use Attach for update Entity Framework 6?
在搜索通过 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 book and the tutorial 的相关章节,但他们使用 2-query-approach。我也冲浪了,但没有找到我的问题的答案。请帮我解释一下或一些好的数学。
如果您知道某个实体已存在于数据库中,但当前未被上下文跟踪(在您的情况下是这样),那么您可以告诉上下文使用 [= DbSet
上的 12=] 方法。
所以总而言之,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();
什么时候应该将实体的状态显式更改为已修改?
当您知道某个实体已存在于数据库中但已进行更改时。与您的示例相同的场景
在搜索通过 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 book and the tutorial 的相关章节,但他们使用 2-query-approach。我也冲浪了,但没有找到我的问题的答案。请帮我解释一下或一些好的数学。
如果您知道某个实体已存在于数据库中,但当前未被上下文跟踪(在您的情况下是这样),那么您可以告诉上下文使用 [= DbSet
上的 12=] 方法。
所以总而言之,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();
什么时候应该将实体的状态显式更改为已修改?
当您知道某个实体已存在于数据库中但已进行更改时。与您的示例相同的场景