使用XAF DevExpress创建EF Core迁移时遇两类错误求助
解决XAF EF Core迁移报错的方案
针对第一个错误:字典键不存在
这个问题大概率是DevExpress BaseImpl.EFCore包与XAF核心包版本不匹配,或是Audit Trail模块的实体映射配置遗漏导致的,按以下步骤排查:
- 全量检查所有DevExpress NuGet包(包括
DevExpress.Persistent.BaseImpl.EFCore、DevExpress.ExpressApp.EFCore等),确保版本完全统一——哪怕是小版本号(比如22.1.4)也要一致,不能混合不同版本 - 检查你的DbContext实现:必须继承
XafDbContext,且OnModelCreating方法中先调用base.OnModelCreating(modelBuilder),同时显式注册Audit Trail相关实体:protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.UseChangeTrackingProxies(); modelBuilder.UseObjectSpaceLinkProxies(); // 注册Audit Trail实体 modelBuilder.Entity<AuditDataItemPersistent>(); modelBuilder.Entity<AuditDataPersistent>(); } - 清理项目的bin、obj文件夹,重新生成解决方案后再执行
Add-Migration InitialCreate
针对第二个错误:IXafDbContextFactory类型加载失败
这个错误是因为接口协变/逆变使用非法,本质是DbContext工厂的实现不符合XAF规范,解决步骤:
- 检查你的DbContext工厂类,必须严格实现
IXafDbContextFactory<T>,泛型参数只能是你的DbContext类型,不能加协变/逆变修饰符,正确示例:public class YourDbContextFactory : IXafDbContextFactory<YourDbContext> { public YourDbContext CreateDbContext(string connectionString) { var optionsBuilder = new DbContextOptionsBuilder<YourDbContext>(); optionsBuilder.UseSqlServer(connectionString); return new YourDbContext(optionsBuilder.Options); } } - 再次确认所有DevExpress包版本完全一致,版本不兼容是这类加载错误的常见原因
- 若升级包后出现问题,删除项目obj文件夹下的
project.assets.json,重新还原NuGet包
额外排查点
- 执行迁移命令时,Package Manager Console的默认项目必须选你的模块项目(而非Win/Web启动项目)
- 若启用了Audit Trail模块,确保在模块的
Setup方法中正确注册服务:public override void Setup(XafApplication application) { base.Setup(application); application.SetupComplete += (s, e) => { AuditTrailService.Instance.StartAudit(((XafApplication)s).ObjectSpaceProvider); }; }
内容的提问来源于stack exchange,提问作者SrTemas
相关产品推荐
相关产品推荐

