C#MVC种子数据库不工作 - NullErrorException
问题描述:
我正在使用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();
}
}
它说代码中的“错误显示在这里”是我得到空错误异常的地方。我不知道我在做什么错,我需要在创建数据库时创建角色和扩展表。如果有人能帮助我,我会非常感激!谢谢!
答
因为context.Extension
是null
和你的代码试图呼吁null
的Add
方法,这是造成典型的空引用异常。
原因是它是因为你没有将它定义为可设置的属性& gettable。没有set
访问器的属性被视为只读。没有get
存取器的属性被视为只写。在你的情况下,你使你的财产不可读或不可写!
在你ApplicationDbContext
类,更新属性定义有set
和get
访问器,它应该工作
public DbSet<ExtendedIdentity> Extension; { get; set; }
太感谢你了!只是一个细节,你认为这样写的代码可以吗?因为我在几个地方发红,我应该处理上下文,但不知道这里是否需要 –
,你可以使用'var db = new ApplicationDbContext()){//现在使用db} – Shyju