【问题标题】:EF Core 2.1 project Add-Migration NullReferenceExceptionEF Core 2.1 项目添加迁移 NullReferenceException
【发布时间】:2018-11-30 09:13:36
【问题描述】:

我在最近转换为 dotnet core 2.1 的项目中收到 NullReferenceException

我的 EF 库项目是 dotnet core 2.1。代码优先迁移。

CsvHelper 6.0.2
Microsoft.EntityFrameworkCore 2.1.0
Microsoft.EntityFrameworkCore.Design 2.1.0
Microsoft.EntityFrameworkCore.SqlServer 2.1.0
Microsoft.EntityFrameworkCore.Tools 2.1.0

add-migration 命令的输出

PM> add-migration -Name MyMigration -Context EscData01Context -Project Data\EscData01 -StartupProject PacmsTri -verbose
Using project 'Data\EscData01'.
Using startup project 'PacmsTri'.
Build started...
Build succeeded.
C:\Program Files\dotnet\dotnet.exe exec --depsfile C:\temp\PacmsTri\dev\***\source\PacmsTri\bin\Debug\netcoreapp2.1\PacmsTri.deps.json --additionalprobingpath "C:\Users\***\.nuget\packages" --additionalprobingpath "C:\Program Files\dotnet\sdk\NuGetFallbackFolder" --runtimeconfig C:\temp\PacmsTri\dev\***\source\PacmsTri\bin\Debug\netcoreapp2.1\PacmsTri.runtimeconfig.json "C:\Users\***\.nuget\packages\microsoft.entityframeworkcore.tools\2.1.0\tools\netcoreapp2.0\any\ef.dll" migrations add MyMigration --json --context EscData01Context --verbose --no-color --prefix-output --assembly C:\temp\PacmsTri\dev\****\source\PacmsTri\bin\Debug\netcoreapp2.1\EscData01.dll --startup-assembly C:\temp\PacmsTri\dev\****\source\PacmsTri\bin\Debug\netcoreapp2.1\PacmsTri.dll --project-dir C:\temp\PacmsTri\dev\****\source\Data\EscData01\ --language C# --working-dir C:\temp\PacmsTri\dev\****\source --root-namespace Sms.Office.Data.EscData01
Using assembly 'EscData01'.
Using startup assembly 'PacmsTri'.
Using application base 'C:\temp\PacmsTri\dev\***\source\PacmsTri\bin\Debug\netcoreapp2.1'.
Using working directory 'C:\temp\PacmsTri\dev\***\source\PacmsTri'.
Using root namespace 'Sms.Office.Data.EscData01'.
Using project directory 'C:\temp\PacmsTri\dev\***\source\Data\EscData01\'.
Finding DbContext classes...
Finding IDesignTimeDbContextFactory implementations...
Finding application service provider...
Finding IWebHost accessor...
Using environment 'Development'.
Using application service provider from IWebHost accessor on 'Program'.
Found DbContext 'AuthDbContext'.
Found DbContext 'DmsContext'.
Found DbContext 'EscData01Context'.
Found DbContext 'MailServicesContext'.
Found DbContext 'PmsDdContext'.
Finding DbContext classes in the project...
Using context 'EscData01Context'.
Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 2.1.0-rtm-30799 initialized 'EscData01Context' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Finding design-time services for provider 'Microsoft.EntityFrameworkCore.SqlServer'...
Using design-time services from provider 'Microsoft.EntityFrameworkCore.SqlServer'.
Finding design-time services referenced by assembly 'PacmsTri'.
No referenced design-time services were found.
Finding IDesignTimeServices implementations in assembly 'PacmsTri'...
No design-time services were found.
System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.EntityFrameworkCore.Metadata.Internal.TableMapping.<>c.<GetRootType>b__10_0(IEntityType t)
   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at Microsoft.EntityFrameworkCore.Metadata.Internal.TableMapping.GetRootType()
   at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.GetSortedProperties(TableMapping target)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationsModelDiffer.Add(TableMapping 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(IModel source, IModel 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)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_1.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Object reference not set to an instance of an object.
PM> 

我尝试将 IDesignTimeServices 对象添加到我的启动项目中,并尝试添加 IDesignTimeDbContextFactory。 我还尝试使用相同的 dotnet 和 EF 版本号创建一个新的示例项目,指向相同的数据库,并且能够生成上下文并成功创建迁移。所以我看不到的两个项目之间肯定有一些区别。

PM> add-migration MyMigration2 -Project ClassLibrary1 -StartupProject WebApplication20 -Context ESC_DATA01Context
Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 2.1.0-rtm-30799 initialized 'ESC_DATA01Context' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
To undo this action, use Remove-Migration.

非常感谢任何帮助。

更新:

我最初发布此错误是由项目迁移到标准 2.0 引起的,但在将其转换回 dotnetcore2.1 并且错误仍然存​​在后打折了这个想法。

【问题讨论】:

    标签: asp.net entity-framework-core entity-framework-core-2.1


    【解决方案1】:

    看起来此错误是由对我的 ModelSnapshot 类中不再存在的模型的某些引用引起的。包括我从上下文中删除 AspNetCore.Identity 后留下的一些身份模型。

    从我的EscData01ContextModelSnapshot 中删除下面的代码解决了这个问题。

    modelBuilder.Entity("Sms.Office.Data.EscData01.Models.ExcelTemplate", b =>
    {
        b.HasOne("Sms.Office.Data.EscData01.Models.File", "File")
            .WithMany()
            .HasForeignKey("FileId")
            .OnDelete(DeleteBehavior.Cascade);
    });
    modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
    {
        b.HasOne("Sms.Office.Data.EscData01.Authentication.ApplicationRole")
            .WithMany()
            .HasForeignKey("RoleId")
            .OnDelete(DeleteBehavior.Cascade);
    });
    modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
    {
         b.HasOne("Sms.Office.Data.EscData01.Authentication.ApplicationUser")
             .WithMany()
             .HasForeignKey("UserId")
             .OnDelete(DeleteBehavior.Cascade);
    });
    modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
    {
         b.HasOne("Sms.Office.Data.EscData01.Authentication.ApplicationUser")
             .WithMany()
             .HasForeignKey("UserId")
             .OnDelete(DeleteBehavior.Cascade);
    });
    modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
    {
         b.HasOne("Sms.Office.Data.EscData01.Authentication.ApplicationRole")
             .WithMany()
             .HasForeignKey("RoleId")
             .OnDelete(DeleteBehavior.Cascade);
         b.HasOne("Sms.Office.Data.EscData01.Authentication.ApplicationUser")
             .WithMany()
             .HasForeignKey("UserId")
             .OnDelete(DeleteBehavior.Cascade);
    });   
    modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
    {
         b.HasOne("Sms.Office.Data.EscData01.Authentication.ApplicationUser")
             .WithMany()
             .HasForeignKey("UserId")
             .OnDelete(DeleteBehavior.Cascade);
    });
    

    【讨论】:

    • 遇到了同样的错误。这个答案帮助我解决了这个问题。我的过程有点不同(快照太大,无法在大海捞针): 1 - 删除快照 2 - 添加迁移(现在没有错误,但创建的迁移就像初始一样,包含所有内容,而不仅仅是增量) 3 - 从新快照中删除最近的更改(因此它与新创建的迁移之前的迁移匹配) 4 - 删除新创建的迁移和设计器文件 5 - 重复 add-migration 命令。现在所有文件都重新同步并且没有错误。希望它可以帮助别人。
    • 这里有同样的问题。解决了删除外键约束名称(.HasConstraintName("FK_child_to_parent_FK"))更多信息Add-Migration with changing FKs fails in 2.1 (works again in 2.2 preview)
    • @StefandeKok 这个 5 步设计器文件重置方法为我们解决了这个问题。我们的快照文件有 4000 行长,对实体或属性的每个引用都是字符串,这使得我们几乎不可能找到现在丢失的引用。
    猜你喜欢
    • 1970-01-01
    • 2020-03-19
    • 2017-05-30
    • 2018-10-02
    • 2019-03-03
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多