C# MVC 播种数据库不工作 - NullErrorException

C# MVC seeding DB not working - NullErrorException

我正在使用 ASP.NET Identity,我在数据库中创建了两个 tables 来扩展它的功能。一个 table 与 AspNetRoles 保持多对多关系,另一个是该关系的结果。 (我认为这不重要,但以防万一)

里面IdentityConfig.cs我有以下代码:

public class ApplicationDbInitializer : CreateDatabaseIfNotExists<ApplicationDbContext>
{
    protected override void Seed(ApplicationDbContext context)
    {
        IList<ExtendedIdentity> extendedIdentityList = new List<ExtendedIdentity>
        {
            new ExtendedIdentity() { Name = "TestName1" },
            new ExtendedIdentity() { Name = "TestName2" }
        };

        foreach (var item in extendedIdentityList)
        {
            context.Extension.Add(item); //THE ERROR SHOWS UP HERE
        }

        base.Seed(context);
    }
}

里面IndentityModels.cs我有以下代码:

public class ApplicationRole : IdentityRole
{
    public ApplicationRole()
    {
    }

    public ApplicationRole(string name)
        : base(name)
    {
    }

    //

    public virtual ICollection<ExtendedIdentity> Extension{ get; private set; }
}

public class ExtendedIdentity
{
    public string Id { get; set; } = Guid.NewGuid().ToString();
    public string Name { get; set; }
    public virtual ICollection<ApplicationRole> Roles { get; private set; }

}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        :base("LocalTestingDB", throwIfV1Schema: false)
    {
        Database.SetInitializer(new ApplicationDbInitializer());
    }

    public DbSet<ExtendedIdentity> Extension;

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<ExtendedIdentity>()
            .ToTable("Extension")
            .HasKey(x => x.Id);

        modelBuilder.Entity<ApplicationRole>()
            .HasMany<UserPermission>(ar => ar.Extension)
            .WithMany(ei => ei.Roles)
            .Map(arei =>
                {
                    arei.MapLeftKey("RoleId");
                    arei.MapRightKey("ExtensionId");
                    arei.ToTable("AspNetRoleExtension");
                });
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

代码中显示 "THE ERROR SHOWS UP HERE" 的地方就是我得到空错误异常的地方。我不知道我做错了什么,我需要在创建数据库时为角色和扩展 table 设置种子。如果有人可以帮助我,我将不胜感激!谢谢!

因为 context.Extensionnull 并且您的代码正在尝试调用 null 上的 Add 方法,这会导致典型的 Null 引用异常。

之所以为空,是因为您没有将其定义为可设置和可获取的 属性。没有 set 访问器的 属性 被认为是只读的。没有 get 访问器的 属性 被认为是只写的。在您的情况下,您使 属性 既不可读也不可写!

在您的 ApplicationDbContext class 中,更新 属性 定义以具有 setget 访问器,它应该可以工作

public DbSet<ExtendedIdentity> Extension; { get;  set; }