Entity Framework 出现 "此 ObjectContext 实例已释放,不可再用于需要连接的操作" 的错误

原因

Entity的导航属性在View中使用,但是该Entity所在的Context已经在Controller中通过 using 释放掉;但是Entity又具有Deferred Query Evaluation性质,因此,导航属性对象没有被加载,从而出现上述错误。

解决方案

解决方法一:How to: Explicitly Load Related Objects

禁用Context的Deferred Query Evaluation,然后在查询结束后手动加载所有需要的导航属性

context.ContextOptions.LazyLoadingEnabled = false;

if (!contact.SalesOrderHeaders.IsLoaded)
{
     contact.SalesOrderHeaders.Load();
}

解决方法二:How to: Use Query Paths to Shape Results

var contacts = (from contact in context.Contacts
                  .Include("SalesOrderHeaders.SalesOrderDetails")
                    select contact).FirstOrDefault();

解决方法三:变成List<T>

总结:

在Linq to Entity中,ObjectContext 实例已释放后就无法通过导航属性进行查询。导航属性的本质就是重新发送一个查找外键表的命令给数据库执行,连接数据库的对象实例释放了,自然就无法进行查询操作。为了避免这样的错误,取数据时尽量先转换成List<T>数据集合。

时间: 2024-10-14 14:52:14

Entity Framework 出现 "此 ObjectContext 实例已释放,不可再用于需要连接的操作" 的错误的相关文章

此 ObjectContext 实例已释放,不可再用于需要连接的操作。

使用ef 表关联主外键,查询的时候并没有include 查询出外联表,ef会延迟加载外联表,底层方法返回后DbContext释放,导致此错误信息. 1.可以自建立model 然后toList(); 2.using(DbContext db=new DbContext()){ //加入 db.Configuration.LazyLoadingEnabled = false;   不加载外链表 } 或者直接在DbContext构造方法中加入  Configuration.LazyLoadingEna

C# Entity Framework The ObjectContext instance has been disposed and can no longer be used for operations that require a connection

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection 该对象上下文实例已被释放,不能用于需要连接的操作. shared context per request模式,缩短Entity实例的存在时间和降低Entity实例的共享性,并考虑性能,因为Entity需要手动Dispose. public override void Disp

entity framework—简单的增删改查

应用程序对数据库执行CRUD时,通过entity framework方式,实际上是对DbContext的操作,DbContext是EF的入口,DbContext拿到对应的消息(CRUD)后,通过ORM中的Mapping来将对象O映射成数据库中的关系R. 下面就简单的实现一下利用entity framework实现简单的增删改查.首先要说明的是我已经建立了在解决方案中映射了数据库中表"Customer".所有的操作都是针对这张表. 1.增加 Customer customer = new

Entity Framework 与 面向对象

说要分享,我了个*,写了一半放草稿箱了两个星期都快发霉了,趁着周末写完发出来吧. 文章分为五部分: 基础.类讲述的是用到的一些EF与面向对象的基础: 业务是讲怎么划分设计业务: 设计模式和工作模式讲述了在项目中用得比较多的通用的方法: 最后的项目迭代这次怎么迭代开发 现在有点晚了,我公司在山上,得赶着下山,没来得及审稿,所以有错误欢迎指正. 个人觉得有点赶,而且有点长,所以排列文本控制得不是很好,有待再继续补充或者修改. ======================分割线,专治强迫症,下面是半个

浅谈Entity Framework中的数据加载方式

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Architecture.aspx,其中的一系列文

MVC5 Entity Framework学习之弹性连接和命令拦截

到目前为止,应用程序一直在本地IIS Express上运行.如果你想让别人通过互联网访问你的应用程序,你必须将它部署到WEB服务器同时将数据库部署到数据库服务器 本篇文章中将教你如何使用在将你的应用程序部署到云环境时的Entity Framework 6的非常有价值的两个特性:弹性连接(瞬时错误的自动重试)和命令拦截(捕获所有发送到数据库的SQL查询语句并记录至日志中). 1.启用弹性连接 当你将应用程序部署到Windows Azure时,相应的数据库部也应被部署到Windows Azure S

ASP.NET Core 开发-Entity Framework (EF) Core 1.0 Database First

ASP.NET Core 开发-Entity Framework Core 1.0 Database First,ASP.NET Core 1.0 EF Core操作数据库. Entity Framework Core 1.0 也已经发布了,可以适用于 .NET Core 1.0 及ASP.NET Core 1.0 . EF Core RC2 时,使用的Code First: http://www.cnblogs.com/linezero/p/EntityFrameworkCore.html E

ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.

在ASP.Net Core 2.0的项目里, 我使用Entity Framework Core 2.0 作为ORM. 有人习惯把数据库的连接字符串写在appSettings.json里面, 有的习惯写死在程序里, 有的习惯把它放在launchSettings.json里面(只放在这里的话迁移命令就找不到连接字符串了吧). 我习惯把连接字符串写成系统的环境变量. 我这个项目数据库的连接字符串的变量名是 “MLH:SalesApi:DefaultConnection”, 在windows 10上,

Entity Framework使用EntityState和Attach来保存数据变化以及更新实体的个别字段

在使用Entity Framework作为ORM来存取数据的过程中,最常规的操作就是对数据对象的更新.本文将会包含如何Attach Entity到一个数据Context中,以及如何使用EntityState字段状态来保存数据变化. 文本参考了如下两篇文章: https://msdn.microsoft.com/en-us/data/jj592676 https://stackoverflow.com/questions/30987806/dbset-attachentity-vs-dbconte