【问题标题】:.net 5 not seeding with data.net 5 未播种数据
【发布时间】:2021-06-17 20:13:34
【问题描述】:

我的应用没有将数据播种到控制器中的数据库。 它会创建数据库,但不会播种数据。

    [HttpGet("NewDb/{dbName}")]
    public void CreateNewDb(string dbName)
    {
        var optionsBuilder = new DbContextOptionsBuilder<DataContext>()
            .UseMySql("server=localhost; user=username; password=password;database=" + dbName, 
            new MySqlServerVersion(new Version(8, 0, 21)));

        DataContext context = new DataContext(optionsBuilder.Options);
        context.Database.Migrate(); 
         
        // where seed is not seeding the database.   
        Seed.SeedRoles(context, _roleManager);
      }

种子.cs 这是创建角色的地方

  public static void SeedRoles(DataContext context, RoleManager<Role> roleManager)
    {
        if (!context.Roles.Any())
        {
            //create roles
            var roles = new List<Role>
            {
                new Role{Name = "Admin"},
                new Role{Name = "Standard"}, 
                new Role{Name = "Basic"} 
            };
            foreach (var role in roles)
            {
                roleManager.CreateAsync(role).Wait();                    
            }  
        }
                         
    } 

【问题讨论】:

  • 你能把你的种子类的代码贴出来吗?
  • 我已经发布了种子类
  • 是该表支持的角色 - 如果您想播种 ef 核心已内置种子支持
  • 如果你能提供帮助,你永远不应该使用 .Wait() 。当您调用返回 Task 或 Task 的方法时,您应该 await 该方法。这意味着 SeedRoles 需要标记为异步并返回一个任务,并且您的 CreateNewDb 操作方法应标记为异步并返回一个任务并使用await 调用返回任务的方法,例如 Seed.SeedRoles。
  • 看起来你想做的事,你需要做的就是打电话给context.SaveChangesAsync();

标签: c# asp.net .net asp.net-core .net-5


【解决方案1】:

试试这个

[HttpGet("NewDb/{dbName}")]
public async Task CreateNewDbAsync(string dbName, CancellationToken cancellationToken = default)
{
    var optionsBuilder = new DbContextOptionsBuilder<DataContext>()
        .UseMySql("server=localhost; user=username; password=password;database=" + dbName, 
        new MySqlServerVersion(new Version(8, 0, 21)));

    DataContext context = new DataContext(optionsBuilder.Options);
    context.Database.Migrate(); 
     
    // where seed is not seeding the database.   
    Seed.SeedRolesAsync(context, _roleManager, cancellationToken);
  }

还有这个

public static async Task SeedRolesAsync(DataContext context, RoleManager<Role> roleManager, CancellationToken cancellationToken = default)
{
    if (!context.Roles.Any())
    {
        //create roles
        var roles = new List<Role>
        {
            new Role{Name = "Admin"},
            new Role{Name = "Standard"}, 
            new Role{Name = "Basic"} 
        };
        foreach (var role in roles)
        {
            context.Add(role);
        }
        await context.SaveChangesAsync(cancellationToken);
    }
                     
} 

但我们对数据进行播种是在上下文中执行以下操作。这将在您对数据库调用“迁移”时调用。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Role>().HasData(Roles.Data);
}

public static class Roles
{
   // Here is where we stubb out our data
    public static List<Role> Data = new List<Role> {};
}

【讨论】:

  • 在 SeedRolesAsync 方法中用 context.Add(role) 替换了 roleManaer。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
相关资源
最近更新 更多