Entity Framework 核心在初始创建后添加新迁移
Entity Framework Core Adding New Migration After Initial Creation
我有 ASP.Net 核心项目,作为 ORM,它基于 Entity Framework 核心版本 3.1.8。它可以从 CLor Package Manager Console 迁移和更新以进行首次初始创建,不用担心。问题是当我为现有实体添加新的 table 或新的 属性 时,它无法添加新的迁移。异常详情如下。
PM> dotnet ef 迁移添加“newone”
构建开始...
构建成功。
System.NullReferenceException: 对象引用未设置为对象的实例。
在 Microsoft.EntityFrameworkCore.Update.Internal.SharedTableEntryMap1.GetMainEntry(IUpdateEntry entry) at Microsoft.EntityFrameworkCore.Update.Internal.SharedTableEntryMap
1.GetOrAddValue(IUpdateEntry 条目)
在 Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.DiffData(TableMapping 源、TableMapping 目标、DiffContext diffContext)
在 Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Diff(TableMapping 源,TableMapping 目标,DiffContext diffContext)+MoveNext()
在 Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.DiffCollection[T](IEnumerable1 sources, IEnumerable
1 目标,DiffContext diffContext,Func4 diff, Func
3 添加,Func3 remove, Func
4[] 谓词)+MoveNext()
在 System.Linq.Enumerable.ConcatIterator1.MoveNext() at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Sort(IEnumerable
1 次操作中,DiffContext diffContext)
在 Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.GetDifferences(IModel 源,IModel 目标)
在 Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.ScaffoldMigration(字符串迁移名称、字符串根命名空间、字符串子命名空间、字符串语言)
在 Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(字符串名称、字符串输出目录、字符串上下文类型)
在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(字符串名称、字符串输出目录、字符串上下文类型)
在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_0.<.ctor>b__0()
在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.b__0()
在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(动作动作)
对象引用未设置为对象的实例。
下面还有我的 DbContext 和 DbContextFactory 代码片段
//我的DbContextFactory CreateDbContext方法
public DataContext CreateDbContext(string[] args)
{
var env = GetEnvironment();
var connectionStr = SetDatabaseConnectionString(env);
var optionsBuilder = new DbContextOptionsBuilder<DataContext>();
optionsBuilder.UseSqlServer(Environment.GetEnvironmentVariable(connectionStr, EnvironmentVariableTarget.Machine));
optionsBuilder.EnableSensitiveDataLogging();
return new DataContext(optionsBuilder.Options, null);
}
//我的DbContext构造器
public DataContext(DbContextOptions<DataContext> options, IHttpContextAccessor httpContextAccessor) : base(options)
{
_logger = LogManager.GetCurrentClassLogger();
_logger.Info("Domain User : SYSTEM Details : DataContext initialized");
Database?.SetCommandTimeout(5000);//TODO : fetch from config
_httpContextAccessor = httpContextAccessor;
}
经过多方工作人员解决问题。是的,实体中存在导航 属性,但未定义关系。尝试添加新迁移后,抛出空对象引用异常但没有详细信息!我调试了所有迁移 class,最后意识到空对象是关系。我只是建议,如果您遇到任何类型的迁移问题,评论所有 poco 实体并逐步检查所有实体导航和关系以找到问题。
我有 ASP.Net 核心项目,作为 ORM,它基于 Entity Framework 核心版本 3.1.8。它可以从 CLor Package Manager Console 迁移和更新以进行首次初始创建,不用担心。问题是当我为现有实体添加新的 table 或新的 属性 时,它无法添加新的迁移。异常详情如下。
PM> dotnet ef 迁移添加“newone”
构建开始...
构建成功。
System.NullReferenceException: 对象引用未设置为对象的实例。
在 Microsoft.EntityFrameworkCore.Update.Internal.SharedTableEntryMap1.GetMainEntry(IUpdateEntry entry) at Microsoft.EntityFrameworkCore.Update.Internal.SharedTableEntryMap
1.GetOrAddValue(IUpdateEntry 条目)
在 Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.DiffData(TableMapping 源、TableMapping 目标、DiffContext diffContext)
在 Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Diff(TableMapping 源,TableMapping 目标,DiffContext diffContext)+MoveNext()
在 Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.DiffCollection[T](IEnumerable1 sources, IEnumerable
1 目标,DiffContext diffContext,Func4 diff, Func
3 添加,Func3 remove, Func
4[] 谓词)+MoveNext()
在 System.Linq.Enumerable.ConcatIterator1.MoveNext() at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Sort(IEnumerable
1 次操作中,DiffContext diffContext)
在 Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.GetDifferences(IModel 源,IModel 目标)
在 Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.ScaffoldMigration(字符串迁移名称、字符串根命名空间、字符串子命名空间、字符串语言)
在 Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(字符串名称、字符串输出目录、字符串上下文类型)
在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(字符串名称、字符串输出目录、字符串上下文类型)
在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_0.<.ctor>b__0()
在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.b__0()
在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(动作动作)
对象引用未设置为对象的实例。
下面还有我的 DbContext 和 DbContextFactory 代码片段
//我的DbContextFactory CreateDbContext方法
public DataContext CreateDbContext(string[] args)
{
var env = GetEnvironment();
var connectionStr = SetDatabaseConnectionString(env);
var optionsBuilder = new DbContextOptionsBuilder<DataContext>();
optionsBuilder.UseSqlServer(Environment.GetEnvironmentVariable(connectionStr, EnvironmentVariableTarget.Machine));
optionsBuilder.EnableSensitiveDataLogging();
return new DataContext(optionsBuilder.Options, null);
}
//我的DbContext构造器
public DataContext(DbContextOptions<DataContext> options, IHttpContextAccessor httpContextAccessor) : base(options)
{
_logger = LogManager.GetCurrentClassLogger();
_logger.Info("Domain User : SYSTEM Details : DataContext initialized");
Database?.SetCommandTimeout(5000);//TODO : fetch from config
_httpContextAccessor = httpContextAccessor;
}
经过多方工作人员解决问题。是的,实体中存在导航 属性,但未定义关系。尝试添加新迁移后,抛出空对象引用异常但没有详细信息!我调试了所有迁移 class,最后意识到空对象是关系。我只是建议,如果您遇到任何类型的迁移问题,评论所有 poco 实体并逐步检查所有实体导航和关系以找到问题。