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.Extension
是 null
并且您的代码正在尝试调用 null
上的 Add
方法,这会导致典型的 Null 引用异常。
之所以为空,是因为您没有将其定义为可设置和可获取的 属性。没有 set
访问器的 属性 被认为是只读的。没有 get
访问器的 属性 被认为是只写的。在您的情况下,您使 属性 既不可读也不可写!
在您的 ApplicationDbContext
class 中,更新 属性 定义以具有 set
和 get
访问器,它应该可以工作
public DbSet<ExtendedIdentity> Extension; { get; set; }
我正在使用 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.Extension
是 null
并且您的代码正在尝试调用 null
上的 Add
方法,这会导致典型的 Null 引用异常。
之所以为空,是因为您没有将其定义为可设置和可获取的 属性。没有 set
访问器的 属性 被认为是只读的。没有 get
访问器的 属性 被认为是只写的。在您的情况下,您使 属性 既不可读也不可写!
在您的 ApplicationDbContext
class 中,更新 属性 定义以具有 set
和 get
访问器,它应该可以工作
public DbSet<ExtendedIdentity> Extension; { get; set; }