如何创建入口程序集中类型的实例?导入DLL创建DbContext实例遇阻求助
如何在无目标DbContext类型的解决方案中创建DLL内的实例
嘿,这个问题其实很好解决——你完全不需要在当前解决方案里定义这个DbContext的具体类型,因为那个DLL已经包含了它的实现,咱们有几种实用的办法来创建并使用它的实例:
方法1:通过反射调用并基于DbContext基类操作
首先,你可以加载目标DLL,通过反射调用静态方法获取实例,然后将其转换为DbContext基类(前提是你的项目已经引用了Entity Framework相关程序集,比如Microsoft.EntityFrameworkCore):
// 加载目标DLL Assembly targetAssembly = Assembly.LoadFrom("你的DLL文件路径.dll"); // 获取EntityBase的类型(注意要写完整的命名空间,比如"Namespace.EntityBase") Type entityBaseType = targetAssembly.GetType("EntityBase"); // 获取静态方法MyCreateNewDbContextInstance MethodInfo createContextMethod = entityBaseType.GetMethod( "MyCreateNewDbContextInstance", BindingFlags.Public | BindingFlags.Static ); // 调用方法获取DbContext实例 DbContext contextInstance = (DbContext)createContextMethod.Invoke(null, null); // 之后就可以用DbContext基类的通用方法,比如执行查询、保存更改 var queryResult = contextInstance.Set<dynamic>().FromSqlRaw("SELECT * FROM YourTableName").ToList(); contextInstance.SaveChanges();
方法2:用dynamic类型简化操作
如果你清楚DLL中DbContext的具体成员(比如DbSet、自定义方法),可以用dynamic类型跳过反射的繁琐步骤,直接调用实例成员:
Assembly targetAssembly = Assembly.LoadFrom("你的DLL文件路径.dll"); Type entityBaseType = targetAssembly.GetType("EntityBase"); MethodInfo createContextMethod = entityBaseType.GetMethod("MyCreateNewDbContextInstance"); dynamic contextInstance = createContextMethod.Invoke(null, null); // 直接调用DbContext的自定义成员,比如假设它有一个名为"Products"的DbSet var productList = contextInstance.Products.ToList();
注意:这种方式没有编译时类型检查,如果调用的成员不存在,运行时会抛出异常,适合你对DLL内DbContext结构非常熟悉的场景。
方法3:直接引用DbContext所在的类库(最优解,如果可行)
如果你能拿到这个DLL对应的类库源码,或者可以通过项目引用、NuGet包添加依赖,那直接引用它是最稳妥的方式——这样你就能直接获取具体的DbContext类型,无需反射:
// 引用后直接调用静态方法 DbContext context = EntityBase.MyCreateNewDbContextInstance(); // 如果知道具体类型,还可以强转以使用更多自定义功能 YourSpecificDbContext specificContext = (YourSpecificDbContext)context;
重要提示
不管用哪种方法,你的项目必须引用Entity Framework的核心程序集,否则无法识别DbContext基类,也没法使用它的通用功能。另外,DLL中的DbContext肯定是DbContext的子类,所以通过基类就能操作它的大部分通用EF功能,特殊的自定义成员则可以用反射或dynamic来访问。
内容的提问来源于stack exchange,提问作者Asım Gündüz
相关产品推荐
相关产品推荐

