已解决的数据库上下文产生null DbSet(

时间:2016-11-07 14:52:08

标签: c# asp.net-core entity-framework-core

我的项目中有3个程序集:MyApp.CoreMyApp.InfrastructureMyApp.Web

MyApp.Core包含数据库模型/实体,MyApp.Infrastructure包含数据库上下文和迁移,MyApp.Web包含Startup类。

数据库是使用代码第一个EF创建的,它存在(我检查过)。

我已在Startup班级ConfigureServices方法中注册了数据库上下文:

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddDbContext<MyAppDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

        services.AddIdentity<Employee, IdentityRole>()
            .AddEntityFrameworkStores<KinderGardenDbContext>()
            .AddDefaultTokenProviders();
        ...
    }

我想使用静态方法MyApp.Infrastructure.MyAppContextSeed.Seed()为我的数据库设定种子。所以我在Configure方法的末尾添加了方法:

...
   MyAppDbContextSeed.Seed(app.ApplicationServices).Wait();
}

在上面的方法中,我解析了数据库上下文:

public static async Task Seed(IServiceProvider services)
{
    ...
    using (var context = services.GetRequiredService<MyAppDbContext>())
    using (var roleManager = services.GetRequiredService<RoleManager<IdentityRole>>())
    using (var userManager = services.GetRequiredService<UserManager<Employee>>())
    {
        if (!await context.Companies.AnyAsync())
        {
            ...
        }
    }
}

在上面的if声明中,Companies为空。

此外,这是我的数据库上下文类:

namespace MyApp.Infrastructure.EntityFramework
{
    public class MyAppDbContext : IdentityDbContext<Employee>
    {
        public DbSet<Company> Companies;
        public DbSet<Person> Persons;
        public DbSet<Employee> Employees;
        public DbSet<KeyCard> KeyCards;
        public DbSet<KeyRequestForm> KeyRequestForms;

        public KinderGardenDbContext(DbContextOptions<KinderGardenDbContext> options) : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);

            builder.Entity<Company>().ToTable("Company");
            builder.Entity<Person>().ToTable("Person");
            builder.Entity<Employee>().ToTable("Employee");
            builder.Entity<KeyCard>().ToTable("KeyCard");
            builder.Entity<KeyRequestForm>().ToTable("KeyRequestForm");

            builder.Entity<KeyCardKeyRequestForm>().ToTable("KeyCardKeyRequestForm");

            builder.Entity<KeyCardKeyRequestForm>()
                .HasKey(c => new { c.KeyCardId, c.KeyRequestFormId });
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这是因为您的DbSet属性实际上不是属性:) ...它们是字段。使用getter和setter以及

创建属性