EF6.0中Add-Migration生成空Up/Down函数及设计时服务未找到问题
问题修复方案
1. 修正实体发现的反射逻辑
你的OnModelCreating中,反射筛选实体的条件存在错误:_interface.Equals(typeof(Import))是在查找实现Import类的类型,但Import是基类而非接口,应该筛选继承Import基类或实现IImport接口的具体实体类。
修改OnModelCreating中的类型筛选代码:
var classes = assembly.GetTypes() .Where(s => s.IsClass && s.IsPublic && !s.IsAbstract // 排除抽象基类Import && (s.IsSubclassOf(typeof(Import)) || s.GetInterfaces().Any(i => i == typeof(IImport))));
2. 正确应用实体配置(调用静态OnModelCreating方法)
当前代码仅将实体注册到ModelBuilder,但未触发IImport和Import中定义的静态配置方法,导致EF无法识别实体的主键、属性规则,进而认为没有需要迁移的实体。
在遍历实体类型的循环中,添加调用静态配置方法的逻辑:
foreach (var classType in classes) { // 注册实体到ModelBuilder modelBuilder.Entity(classType); // 调用IImport接口的静态配置方法 var interfaceMethod = typeof(IImport).GetMethod("OnModelCreating", BindingFlags.Public | BindingFlags.Static); var genericInterfaceMethod = interfaceMethod.MakeGenericMethod(classType); genericInterfaceMethod.Invoke(null, new object[] { modelBuilder }); // 调用Import基类的静态配置方法(需先修正Import类的方法) var baseClassMethod = typeof(Import).GetMethod("OnModelCreating", BindingFlags.Public | BindingFlags.Static); if (baseClassMethod != null) { var genericBaseMethod = baseClassMethod.MakeGenericMethod(classType); genericBaseMethod.Invoke(null, new object[] { modelBuilder }); } }
同时,修正Import类中的静态配置方法,改为泛型适配所有继承它的实体:
public class Import : IImport { public int id { get; set; } public bool Archive { get; set; } public DateTimeOffset CreateOn { get; set; } public DateTimeOffset LastUpdated { get; set; } // 修改为泛型方法,适配所有继承Import的实体 public static void OnModelCreating<T>(ModelBuilder modelBuilder) where T : Import { modelBuilder.Entity<T>().Property(x => x.id); modelBuilder.Entity<T>().Property(x => x.Archive); modelBuilder.Entity<T>().Property(x => x.CreateOn); modelBuilder.Entity<T>().Property(x => x.LastUpdated); } }
3. 解决设计时服务提示问题
EF6设计时工具会优先在启动项目中查找IDesignTimeServices实现,可通过以下方式消除提示并确保加载正常:
- 确保
DesignTimeDbContext类位于**启动项目(FourPointImport.Web)**中,命名空间正确。 - 执行迁移时明确指定项目参数:
Add-Migration InitialCreate -Project FourPointImport.Data -StartupProject FourPointImport.Web - 检查Web项目的
appsettings.json属性,设置“复制到输出目录”为“始终复制”。
4. 修复DbContext配置加载路径错误
你的ApiDbContext无参构造函数中,读取appsettings.json的路径存在语法错误,修正如下:
public ApiDbContext() { var appSettingsPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "appsettings.json"); _configuration = new ConfigurationBuilder().AddJsonFile(appSettingsPath).Build(); }
完成以上修改后,重新执行Add-Migration即可正确识别实体并生成对应的迁移代码。
内容的提问来源于stack exchange,提问作者TheWizardOfTN
相关产品推荐
相关产品推荐

