.NET 8中使用EF工具创建迁移失败:空引用异常
.NET 8 EF Core 初始迁移时触发NullReferenceException错误
我创建了一个.NET 8项目,将所有模型和数据上下文迁移至Angafu.Data项目中。此前曾成功完成过相同操作,但本次执行以下命令创建初始迁移时出现错误:
dotnet ef migrations add Initial --project Angafu.Data # 注:原命令末尾多了一个多余的"I",建议先修正该手误
命令执行输出:
Using assembly 'Angafu.Data'. Using startup assembly 'Angafu.Data'. Using application base 'C:\Users\moham\source\repos\angafu\Angafu.Data\bin\Debug\net8.0'. Using working directory 'C:\Users\moham\source\repos\angafu\Angafu.Data'. Using root namespace 'Angafu.Data'. Using project directory 'C:\Users\moham\source\repos\angafu\Angafu.Data\'. Remaining arguments: . Finding DbContext classes... Finding IDesignTimeDbContextFactory implementations... Found IDesignTimeDbContextFactory implementation 'ApplicationDbContextFactory'. Found DbContext 'ApplicationDbContext'. Finding application service provider in assembly 'Angafu.Data'... Finding Microsoft.Extensions.Hosting service provider... No static method 'CreateHostBuilder(string[])' was found on class 'Program'. No application service provider was found. Finding DbContext classes in the project... Using DbContext factory 'ApplicationDbContextFactory'. Using context 'ApplicationDbContext'. Finding design-time services referenced by assembly 'Angafu.Data'... Finding design-time services referenced by assembly 'Angafu.Data'... No referenced design-time services were found. Finding design-time services for provider 'Npgsql.EntityFrameworkCore.PostgreSQL'... Using design-time services from provider 'Npgsql.EntityFrameworkCore.PostgreSQL'. Finding IDesignTimeServices implementations in assembly 'Angafu.Data'... No design-time services were found. 'ApplicationDbContext' disposed.
触发的异常:
System.NullReferenceException: Object reference not set to an instance of an object. at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Initialize(ColumnOperation columnOperation, IColumn column, RelationalTypeMapping typeMapping, Boolean isNullable, IEnumerable`1 migrationsAnnotations, Boolean inline) at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.InitializeColumnHelper(ColumnOperation columnOperation, IColumn column, Boolean inline) at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Diff(IColumn source, IColumn target, DiffContext diffContext)+MoveNext() at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.DiffCollection[T](IEnumerable`1 sources, IEnumerable`1 targets, DiffContext diffContext, Func`4 diff, Func`3 add, Func`3 remove, Func`4[] predicates)+MoveNext() at System.Linq.Enumerable.ConcatIterator`1.MoveNext() at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Diff(ITable source, ITable target, DiffContext diffContext)+MoveNext() at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.DiffCollection[T](IEnumerable`1 sources, IEnumerable`1 targets, DiffContext diffContext, Func`4 diff, Func`3 add, Func`3 remove, Func`4[] predicates)+MoveNext() at System.Linq.Enumerable.ConcatIterator`1.MoveNext() at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Sort(IEnumerable`1 operations, DiffContext diffContext) at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.GetDifferences(IRelationalModel source, IRelationalModel target) at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.ScaffoldMigration(String migrationName, String rootNamespace, String subNamespace, String language) at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType, String namespace) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType, String namespace) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_0.<.ctor>b__0() at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.b__0() at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action) Object reference not set to an instance of an object.
我已尝试多种解决方案,包括更新Microsoft.EntityFrameworkCore.Design包、安装Npgsql.EntityFrameworkCore.Design包,但均未解决问题。
可能的解决方向:
- 修正命令手误:确保执行的迁移命令没有多余字符,正确命令应为
dotnet ef migrations add Initial --project Angafu.Data - 检查DbContext工厂实现:确认
ApplicationDbContextFactory能正确初始化ApplicationDbContext,连接字符串配置有效,且未出现null引用 - 统一包版本:确保
Microsoft.EntityFrameworkCore、Npgsql.EntityFrameworkCore.PostgreSQL及相关设计包的版本均为8.x(与.NET 8匹配),避免版本不一致 - 检查实体模型配置:排查实体类中是否存在未正确映射的属性,比如使用了不被PostgreSQL支持的类型、
[Column]注解参数错误,或导航属性配置缺失 - 清理并重建项目:删除
Angafu.Data项目下的bin和obj文件夹,重新生成项目后再执行迁移命令 - 指定上下文类型:在命令中明确指定上下文类,如
dotnet ef migrations add Initial --project Angafu.Data --context ApplicationDbContext - 检查OnModelCreating方法:确认
ApplicationDbContext的OnModelCreating方法中没有初始化null对象的代码,所有模型配置逻辑均能正常执行
内容的提问来源于stack exchange,提问作者Mohamed K. KONE
相关产品推荐
相关产品推荐

