DatabaseInitializer内のIHostingEnvironment.ContentRootPathの取得

.net-core asp.net-core entity-framework-core

質問

私は、jsonファイルに格納されているいくつかのデータを使用してdbをシードしようとしています。

私は注入する必要があるIHostingEnvironment自分の内側にIDatabaseInitializer.Seed()私が使用してJSONファイル読み込むことができるようにする方法IHostingEnvironment.ContentRootPath

このプロパティはデフォルトでメインコンテナによって挿入されますが、 DbConfigurationのコンストラクタにはパラメータがない必要があります。したがって、 IHostingEnvironmentを通じてDbConfigurationSetDatabaseInitializer(new DatabaseInitializer())パイプすることはできません。

/*
* Database Context
*/
[DbConfigurationType(typeof(DatabaseConfiguration))]
public class DatabaseContext : DbContext
{
    public DbSet<User> Users { get; set; }

    public DatabaseContext(string nameOrConnectionString) : base(nameOrConnectionString) { }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention>();
        base.OnModelCreating(modelBuilder);
    }
}

/*
* Database Configuration
*/
public class DatabaseConfiguration : DbConfiguration
{
    // Can't receive injected IHostingEnvironment env because constructor must be parameterless
    public DatabaseConfiguration()
    {
        SetProviderServices("System.Data.SqlClient", SqlProviderServices.Instance);

        // Could pass IHostingEnvironment through constructor
        SetDatabaseInitializer(new DatabaseInitializer()); 
    }
}

/*
* Database Initializer
*/
public class DatabaseInitializer : DropCreateDatabaseAlways<DatabaseContext>
{
    private readonly IHostingEnvironment env;

    // Receives IHostingEnvironment from DatabaseConfiguration
    public DatabaseInitializer(IHostingEnvironment env)
    {
        this.env = env;
    }

    protected override void Seed(DatabaseContext context)
    {
        // Read some .json files
    }
}

人気のある回答

私はdbを初期化しているので、別のクラスを書く必要がありました。これはconfigureから呼び出すことができます。同じことを行い、パラメータとしてパスを渡すことができます

ここで私はそれをどのように呼びます:

        using (var scope = scopeFactory.CreateScope())
        {
            // Initialise Database
            var initializer = scope.ServiceProvider.GetService<IDbInitializer>();
            initializer.SeedAsync().Wait();

            // initialize plugin manager
            var manager = scope.ServiceProvider.GetService<IPluginManager>();
            manager.Initialize(dbConnection);
            if (Configuration.GetSection("PluginService").GetValue<bool>("RunAtStartup") == true)
                manager.Start();
        }

ここではdb initializeクラスがあります

    public interface IDbInitializer
{
    Task SeedAsync();
}

public class DbInitializer : IDbInitializer
{
    private ApplicationDbContext _context;
    private RoleManager<IdentityRole> _roleManager;
    private UserManager<ApplicationUser> _userManager;

    public DbInitializer(ApplicationDbContext context,
                         RoleManager<IdentityRole> roleManager,
                         UserManager<ApplicationUser> userManager)
    {
        _context = context;
        _roleManager = roleManager;
        _userManager = userManager;
    }

    public async Task SeedAsync()
    {
        await CreateRolesAsync();
        await CreateAdminUserAsync();
        await SeedMenuAsync();
    }

    private async Task CreateRolesAsync()
    {
        List<IdentityRole> roles = new List<IdentityRole>();
        roles.Add(new IdentityRole { Name = "Admin", NormalizedName = "ADMINISTRATOR" });
        roles.Add(new IdentityRole { Name = "Member", NormalizedName = "MEMBER" });                     // An email confirmed memeber
        roles.Add(new IdentityRole { Name = "Guest", NormalizedName = "GUEST" });                       // Used for a user that has only checked out as guest
        roles.Add(new IdentityRole { Name = "NotConfirmed", NormalizedName = "NOTCONFIRMED" });         // Used when a guest hasnt confirmed there registration

        foreach (var role in roles)
        {
            var roleExists = await _roleManager.RoleExistsAsync(role.Name);
            if (!roleExists)
            {
                await _roleManager.CreateAsync(role);
            }
        }
    }

    ...

希望が役立つ



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ