当我阅读流行的实体框架教程时,我遇到了这段代码:
Student stud ;
// Get student from DB
using (var ctx = new SchoolDBEntities())
{
stud = ctx.Students.Where(s => s.StudentName == "New Student1").FirstOrDefault<Student>();
}
// change student name in disconnected mode (out of DBContext scope)
if (stud != null)
{
stud.StudentName = "Updated Student1";
}
//save modified entity using new DBContext
using (var dbCtx = new SchoolDBEntities())
{
//Mark entity as modified
dbCtx.Entry(stud).State = System.Data.EntityState.Modified;
dbCtx.SaveChanges();
}
我的问题是:在将实体标记为已修改之前,我们是否需要调用ctx.students.Attach(stud)
?
我知道Attach()
只是将实体附加到上下文中,就像从数据库中读取它一样,这已经在代码的开头完成了。
但在此代码示例中,更新学生时,会创建新的上下文。因此在我看来,我们需要致电Attach()
。这是代码中的错误吗?还是总是没必要?
答案 0 :(得分:0)
来自here:
将现有但已修改的实体附加到上下文
var existingBlog = new Blog { BlogId = 1, Name = "ADO.NET Blog" };
using (var context = new BloggingContext())
{
context.Entry(existingBlog).State = EntityState.Modified;
context.SaveChanges();
}
因此,从上下文请求实体输入也是附加它的便捷方式。