通过IQueryable<T>获得DbContext

来源:互联网 发布:江西年夜饭事件知乎 编辑:程序博客网 时间:2024/05/10 03:31
/*废话不多说直接上代码*/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;namespace Lomeo.EntityFramework.Extensions{    public static class Efext    {        public static DbContext GetContext<TEntity>(this IQueryable<TEntity> query) where TEntity : class        {            if (!(query is ObjectQuery<TEntity> objectQuery))            {                if (!(query is DbQuery<TEntity> dbQuery))                {                    throw new Exception("未能从IQueryable表达式找到DbContext。您确定此表达式来自Ef DbContext吗?");                }                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吗?");                }            }            return objectQuery.Context.GetDbContext();        }        private static DbContext GetDbContext(this ObjectContext objc)        {            if (!(objc.GetType().GetProperty("InterceptionContext", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(objc, null) is DbInterceptionContext interceptionContext))                return null;            return interceptionContext.DbContexts.FirstOrDefault<DbContext>();        }    }}

阅读全文
0 0
原创粉丝点击