asp.net gridView错误:“ objectContext实例” desposed“
InvalidOperationException
>本文使用实体框架在ASP.NET应用程序中介绍了常见的LoanProductName
:“ ObjectContext实例已被处置,不再可用于需要连接的操作。” 这通常是在填充GridView时发生的,专门针对相关的数据字段(例如示例中的
根本原因:懒惰加载和dbcontext处置
>>实体框架的默认懒惰加载机制为导航属性创建代理对象。这些代理依靠DbContext
在访问时获取相关数据。 当DbContext
> 申请访问懒惰的属性之前,出现了问题。
考虑以下典型情况:
<code class="language-csharp">using (CosisEntities db = new CosisEntities()) { // ...data retrieval using db... } // ...later, GridView attempts to access lazy-loaded data...</code>
using
语句确保在封闭块之后立即处置DbContext
,则发生错误。
解决方案:急切的加载或禁用懒惰加载
> 两个有效的解决方案阻止了此错误:
1。急切的加载:
明确加载所需的导航属性> 被处置了。
DbContext
<code class="language-csharp">using (CosisEntities db = new CosisEntities()) { var query = db.MemberLoans.Include(m => m.LoanProduct); // Eager load LoanProduct // ...use query to populate GridView... }</code>
Include(m => m.LoanProduct)
2。禁用懒惰加载:LoanProduct
修改您的实体类,以防止懒惰加载。 对于较小的数据集而言,这更简单,但可能会影响大型数据集的性能。MemberLoans
>
>从导航属性中删除关键字可防止创建懒惰的代理。
>通过实现急切的加载或禁用懒惰加载,您可以防止处置错误,并确保您的GridView正确填充。选择最适合您应用程序的数据访问模式和性能要求的方法。<code class="language-csharp">public class MemberLoan { public string LoanProviderCode { get; set; } public LoanProduct LoanProduct { get; set; } // Remove the 'virtual' keyword }</code>
以上是为什么我的ASP.NET GridView在使用实体框架时会抛出' ObjectContext实例...”?的详细内容。更多信息请关注PHP中文网其他相关文章!