2017-10-19 72 views
0

我正在使用ASP.NET身份,并且我已经在数据库内部创建了两个表来扩展它的功能。一个表格与AspNetRoles保持多对多的关系,另一个表格就是这种关系的结果。 (我不认为这是重要的,但以防万一)C#MVC种子数据库不工作 - NullErrorException

里面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(); 
    } 
} 

它说代码中的“错误显示在这里”是我得到空错误异常的地方。我不知道我在做什么错,我需要在创建数据库时创建角色和扩展表。如果有人能帮助我,我会非常感激!谢谢!

回答

0

因为context.Extensionnull和你的代码试图呼吁nullAdd方法,这是造成典型的空引用异常。

原因是它是因为你没有将它定义为可设置的属性& gettable。没有set访问器的属性被视为只读。没有get存取器的属性被视为只写。在你的情况下,你使你的财产不可读或不可写!

在你ApplicationDbContext类,更新属性定义有setget访问器,它应该工作

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

太感谢你了!只是一个细节,你认为这样写的代码可以吗?因为我在几个地方发红,我应该处理上下文,但不知道这里是否需要 –

+0

,你可以使用'var db = new ApplicationDbContext()){//现在使用db} – Shyju