我的问题:是否可能 - 如果是的话,怎么样? - 使用反射初始化时,使用完全类型对象填充使用实体框架的查询结果?
条件是上下文,实体必须能够在项目中不直接引用的外部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
事件加载它。
非常感谢