[英]NullReferenceException during Entity Framework Core Add-Migration
我正在尝试在我的控制台应用程序中测试 EF Core。 我的项目结构就像
Project_name
- Data Folder
- AppDbContext.cs
- Models Folder
- Person.cs
- Student.cs
- Lecturer.cs
.... etc
- Program.cs
在我的AppDbContext.cs
我配置如下
public class AppDbContext: DbContext
{
/* public AppDbContext(DbContextOptions<AppDbContext> options): base(options)
{}*/
public DbSet<Person> People { get; set; }
public DbSet<Student> Students { get; set; }
public DbSet<Lecturer> Lecturers { get; set; }
public DbSet<Course> Coures { get; set; }
public DbSet<Department> Departments { get; set; }
public DbSet<LecturerCourse> lecturerCourses{ get; set; }
public DbSet<Enrollment> Enrollments { get; set; }
public DbSet<CourseNotice> courseNotices { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder builder)
{
builder.UseSqlServer(@"Server = (localdb)\\mssqllocaldb; Database = efcore_consoleApp; Trusted_Connection = True; MultipleActiveResultSets = true;");
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize Course and AppUser relationship using FluentApi
builder.Entity<LecturerCourse>()
.HasKey(ca => new { ca.CourseId, ca.LecturerId });
builder.Entity<LecturerCourse>()
.HasOne(cu => cu.Course)
.WithMany(c => c.LecturerCourses)
.HasForeignKey(cu => cu.CourseId);
builder.Entity<LecturerCourse>()
.HasOne(cu => cu.Lecturer)
.WithMany(u => u.LecturerCourses)
.HasForeignKey(cu => cu.LecturerId);
builder.Entity<Enrollment>()
.HasKey(e => new { e.CourseId, e.StudentId });
builder.Entity<Enrollment>()
.HasOne(c => c.Course)
.WithMany(e => e.Enrollments)
.HasForeignKey(fk => fk.CourseId);
builder.Entity<Enrollment>()
.HasOne(s => s.Student)
.WithMany(e => e.Enrollments)
.HasForeignKey(fk => fk.StudentId);
}
}
我已经安装了一些需要的软件包,例如
- EntityFrameworkCore(5.0.8)
- EntityFrameworkCoreDesign(5.0.8)
- EntityFrameworkCoreSqlServer(5.0.8)
- EntityFrameworkCoreTools(5.0.8)
当我尝试添加迁移Add-Migration ...
,错误此类Object reference not set to an instance of an object.
发生堆栈跟踪,如
System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.EntityFrameworkCore.Metadata.Internal.InternalEntityTypeBuilder.SetOrAddForeignKey(ForeignKey foreignKey, InternalEntityTypeBuilder principalEntityTypeBuilder, IReadOnlyList`1 dependentProperties, Key principalKey, String propertyBaseName, Nullable`1 isRequired, Nullable`1 configurationSource)
at Microsoft.EntityFrameworkCore.Metadata.Internal.InternalEntityTypeBuilder.CreateForeignKey(InternalEntityTypeBuilder principalEntityTypeBuilder, IReadOnlyList`1 dependentProperties, Key principalKey, String propertyBaseName, Nullable`1 required, ConfigurationSource configurationSource)
at Microsoft.EntityFrameworkCore.Metadata.Internal.InternalEntityTypeBuilder.HasRelationship(EntityType targetEntityType, Nullable`1 navigationToTarget, Nullable`1 inverseNavigation, Nullable`1 setTargetAsPrincipal, ConfigurationSource configurationSource, Nullable`1 required)
at Microsoft.EntityFrameworkCore.Metadata.Internal.InternalEntityTypeBuilder.HasRelationship(EntityType targetEntityType, MemberInfo navigationMember, ConfigurationSource configurationSource, Nullable`1 targetIsPrincipal)
at Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder.HasOneBuilder(MemberIdentity navigationId, EntityType relatedEntityType)
at Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder`1.HasOne[TRelatedEntity](Expression`1 navigationExpression)
at efcore_consoleApp.Data.AppDbContext.OnModelCreating(ModelBuilder builder) in C:\Users\PC_1\source\repos\efcore_consoleApp\efcore_consoleApp\AppDbContext.cs:line 44
at Microsoft.EntityFrameworkCore.Infrastructure.ModelCustomizer.Customize(ModelBuilder modelBuilder, DbContext context)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext context, IConventionSetBuilder conventionSetBuilder, ModelDependencies modelDependencies)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext context, IConventionSetBuilder conventionSetBuilder, ModelDependencies modelDependencies)
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel()
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServicesBuilder.<>c.<TryAddCoreServices>b__7_3(IServiceProvider p)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
at Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<System.IServiceProvider>.get_Instance()
at Microsoft.EntityFrameworkCore.Infrastructure.Internal.InfrastructureExtensions.GetService[TService](IInfrastructure`1 accessor)
at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure`1 accessor)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 factory)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
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.<Execute>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
我是 EF Core 和 .NET 开发的新手,所以希望能得到帮助!
在通过查看堆栈跟踪提到问题可能在第line 44
。 我再次检查了原始代码,就像在我拥有的Models
文件夹中一样
[Keyless]
public class Person {
// some general properties of person
}
public class Lecturer: Person {
public string Id { get; set; }
// some properties that derived from `Person`
}
public class Student: Person {
public string Id { get; set; }
// some properties that derived from `Person`
}
尝试删除Person
类后
public class Lecturer {
public string Id { get; set; }
// some properties
}
public class Student {
public string Id { get; set; }
// some properties
}
现在它起作用了。 老实说,我仍然不知道究竟是什么导致了这个问题。 喜欢看到有经验的人可以给出一些解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.