我在VS 2017社区中使用ASP.NET MVC和C#创建概念验证来创建种子数据。
这是我的基本抽象类:
public abstract class SeedBase
{
protected ApplicationDbContext appDBContext { get; set; }
public SeedBase()
{
}
public SeedBase(IServiceProvider serviceProvider)
{
appDBContext = serviceProvider.GetService<ApplicationDbContext>();
}
public abstract void Seed();
}
然后我还创建了一个允许用户播种的身份抽象:
public abstract class IdentitySeeding : SeedBase
{
protected RoleStore<IdentityRole> roleStore { get; set; }
public IdentitySeeding(IServiceProvider serviceProvider ) : base(serviceProvider)
{
roleStore = new RoleStore<IdentityRole>( appDBContext );
}
protected abstract string[] GetRoleNames();
public void SeedRoles()
{
string[] roles = GetRoleNames();
foreach( string Role in roles)
{
if (!appDBContext.Roles.Any<IdentityRole>( r => r.Name == Role ))
{
roleStore.CreateAsync(new IdentityRole(Role));
}
}
}
public override void Seed()
{
SeedRoles();
}
}
最后,我创建了一个seeder类,它接受一个种子类数组并创建实际的种子:
public class Seeder
{
public Seeder()
{
}
public Seeder(SeedBase[] SeedClasses)
{
}
}
但是,您可能会说,我找不到任何方法来获取IServiceProvider实例。我已经google了一下,在Stack Overflow上遇到了IAppBuilder接口,但深度谷歌搜索并没有发现任何好的线索。然后我扩展了我的搜索,发现了一个神秘的“IServiceCollection” - 理论上 - 它应该在Microsoft Dependency Injection扩展中。我相当肯定我已经通过NuGet正确安装了它,因为它给了我在种子类中使用的IServiceProvider的通用版本。 对我来说很明显我错过了一些东西,但我不确定是什么。 领导赞赏。