Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 无法完成该操作,因为已在实体中释放DbContext_Entity Framework_Entity - Fatal编程技术网

Entity framework 无法完成该操作,因为已在实体中释放DbContext

Entity framework 无法完成该操作,因为已在实体中释放DbContext,entity-framework,entity,Entity Framework,Entity,我采用DbContext.Entities.SaveChanges()行给定错误。此错误为 操作无法完成,因为DbContext已被释放。 我怎样才能避免这个错误呢。 .好的,首先,继续阅读/学习关于IDisposable、使用()块以及命名约定的内容。如果你试图记住“a”、“c”等是什么,只为了节省几秒钟输入一个有意义的名字,那么你的代码就变得更难理解,这对你自己没有任何好处 我很惊讶,您粘贴的代码实际上可以编译,但不知道“上下文”和“DbContext”(名称空间、静态类??)是什么 您将拥

我采用DbContext.Entities.SaveChanges()行给定错误。此错误为

操作无法完成,因为DbContext已被释放。

我怎样才能避免这个错误呢。
.

好的,首先,继续阅读/学习关于
IDisposable
使用()
块以及命名约定的内容。如果你试图记住“a”、“c”等是什么,只为了节省几秒钟输入一个有意义的名字,那么你的代码就变得更难理解,这对你自己没有任何好处

我很惊讶,您粘贴的代码实际上可以编译,但不知道“上下文”和“DbContext”(名称空间、静态类??)是什么

您将拥有一个扩展EF的DbContext的类,我将其称为“MyContext”。。即

在这个类中,您将声明dbset,并且很可能是一个重写的方法
OnModelCreating()
,用于处理实体的任何非平凡配置

public class MyContext : DbContext
{
}
在使用块的范围内执行您需要执行的操作。如果需要将学生数据传递到外部(例如从方法调用返回),请将值复制到普通的“ol C#”对象(ViewModel或DTO)并返回。访问DbContext范围之外的实体将导致错误,因为加载学生的上下文已被释放。即使在作用域保持活动的情况下(例如使用静态上下文[bad!]或使用IoC容器将上下文限定到web请求的范围),您也可以避免错误,但由于延迟加载而导致意外的性能问题

SaveChanges
通常在DbContext的生命周期范围内只需调用一次。当设置为了解实体之间的关系时,EF将管理实体之间的关联,例如外键,甚至是您创建的新实体。人们遇到的一个常见恐慌点是鸡蛋scenario,其中我希望创建一个包含子项的实体,但子项需要父ID,而父ID在调用SaveChanges之前不存在。只要父项和子项关系映射正确,EF将在调用SaveChanges时自动解决此问题,前提是将子项添加到父项的子项集合中。SaveChanges a应用于针对DbContext知道的实体(及其关系)的整个操作集,因此它不会逐个实体应用

这将有助于您开始了解如何合并实体框架并使用它的一次性特性。DBContext的设计寿命相对较短,可以根据需要进行构造和处理。通常情况下,它们的作用域将与工作单元、web请求/操作或类似的工作单元一样长。寿命较长的DBContext将重新定义由于跟踪和缓存的性质,导致性能/资源问题。(此外,在尝试作用域SaveChanges调用、放弃更改等时也会出现问题。)

public class MyContext : DbContext
{
}
public class MyContext : DbContext
{
    public DbSet<TableStudent> Students{ get; set; }
}
using (var myContext = new MyContext())
{
    var students= myContext.Students.Where(x => x.StudentBranch == studentBranch).ToList();

   foreach (var student in students)
   {
     // .. logic...
     student.Situation = true;
   }
   myContext.SaveChanges();
}
// After this point, it is unwise/unsafe to "use" any reference to students.