900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > EntityFramework进阶(三)- 根据IQueryable获取DbContext

EntityFramework进阶(三)- 根据IQueryable获取DbContext

时间:2023-12-28 07:30:57

相关推荐

EntityFramework进阶(三)- 根据IQueryable获取DbContext

本系列原创博客代码已在EntityFramework6.0.0测试通过,转载请标明出处

有时候我们要通过IQueryable获取所在的DbContext信息,这是完全可以的。

以下代码从个人开源框架中抽取而出

using System;using System.Data.Entity;using System.Data.Entity.Core.Objects;using System.Data.Entity.Infrastructure;using System.Data.Entity.Infrastructure.Interception;using System.Linq;using System.Reflection;/** CopyRight © All Rights Reserved* 作者:Rex Sheng*/namespace SuperNet.EntityFramework.Extensions{public static class IQueryableExtensions{public static DbContext GetDbContext<TEntity>(this IQueryable<TEntity> query) where TEntity : class{ObjectQuery<TEntity> objectQuery = null;DbQuery<TEntity> dbQuery = null;if(query is ObjectQuery<TEntity>){objectQuery = (ObjectQuery<TEntity>)query;}else{if(query is DbQuery<TEntity>){dbQuery = (DbQuery<TEntity>)query;var propers = dbQuery.GetType().GetProperty("InternalQuery", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);if (propers == null){throw new Exception("未能从IQueryable表达式找到DbContext。您确定此表达式来自Ef DbContext吗?");}var obj = propers.GetValue(dbQuery, null);propers = obj.GetType().GetProperty("ObjectQuery", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);if (propers == null){throw new Exception("未能从IQueryable表达式找到DbContext。您确定此表达式来自Ef DbContext吗?");}objectQuery = propers.GetValue(obj, null) as ObjectQuery<TEntity>;if (objectQuery == null){throw new Exception("未能从IQueryable表达式找到DbContext。您确定此表达式来自Ef DbContext吗?");}}else{throw new Exception("未能从IQueryable表达式找到DbContext。您确定此表达式来自Ef DbContext吗?");}}return objectQuery.Context.GetDbContext();}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。