使用反射获取强类型实体框架实体

时间:2016-11-17 14:48:04

标签: c# reflection entity-framework-6

我的问题:是否可能 - 如果是的话,怎么样? - 使用反射初始化时,使用完全类型对象填充使用实体框架的查询结果?

条件是上下文,实体必须能够在项目中不直接引用的外部dll中。

我不想手动遍历对象图并反映所有类型。

这是我目前的代码。

Assembly metaAssembly = AppDomain.CurrentDomain.GetAssemblies().
       SingleOrDefault(assembly => assembly.GetName().Name == "Data_Meta");

TypeHelper myTypeHelper = new TypeHelper();
Type dbContextType = myTypeHelper.FindDerivedTypes(metaAssembly, typeof(System.Data.Entity.DbContext)).ToList().FirstOrDefault();

using (var ctx = (DbContext)Activator.CreateInstance(dbContextType))
{
    ctx.Configuration.LazyLoadingEnabled = false;

    var curEntityPI = ctx.GetType().GetProperties().Where(pr => pr.Name == "Worker").First();
    var curEntityType = curEntityPI.PropertyType.GetGenericArguments().First();
    var set = ctx.Set(curEntityType);
    var t = set.ToString();

    Type generic = typeof(DataAccess.Models.Repository.EF.GenericEfDataRepository<,>);
    Type[] typeArgs = { curEntityType, dbContextType };
    Type constructed = generic.MakeGenericType(typeArgs);

    MethodInfo methodInfo = constructed.GetMethod("GetAll");
    object repositoryInstance = Activator.CreateInstance(constructed, new object[] { ctx });
    var navigationPropertyType = typeof(Expression<>).MakeGenericType(
typeof(Func<,>).MakeGenericType(curEntityType, typeof(object)));

    var navigationProperties = Array.CreateInstance(navigationPropertyType, 0);
    var result = methodInfo.Invoke(repositoryInstance, new object[] { navigationProperties });
}

我可以生成一个数据库查询并获得正确数量的结果,但是返回的列表中的项目不会评估为某种类型,除非我将项目中的引用放到dll中,这违背了我的目的。我应该说我正在解析dll的位置并通过AppDomain.CurrentDomain.AssemblyResolve事件加载它。

非常感谢

0 个答案:

没有答案