在startup.cs中播种数据

时间:2018-08-13 09:31:54

标签: c# asp.net asp.net-mvc entity-framework

是否可以在startup.cs中播种数据?在那里而不是在DbContext或迁移配置类中这样做是否有优点或缺点?

public void Configuration(IAppBuilder app)
{
    ConfigureAuth(app);
    SeedData();
}
public void SeedData()
{
    using (ApplicationDbContext _db = new ApplicationDbContext())  {
        if (!_db.Books.Any(n => n.Name == "Seeded in Startup.cs"))
        {
            _db.Books.Add(new Book() { Name = "Seeded in Startup.cs", Date = "1966" });
        }
        _db.SaveChanges();
    }
}

2 个答案:

答案 0 :(得分:4)

我们创建了一个 SeedHelpers.cs 在此文件中,所有种子数据均可用。

public async Task Seed()
        {
            try
            {
                if (RoleManager.Roles.ToList().Count == 0)
                    foreach (string role in typeof(RoleConst).GetConstValue<string>())
                        await RoleManager.CreateAsync(new RoleEntity { Name = role.ToString() });

                if (UserManager.Users.ToList().Count == 0)
                {
                    UserEntity entity = new UserEntity
                    {
                        Email = "y",
                        Active = true,
                        Deleted = false,
                        EmailConfirmed = true,
                        Created = DateTime.UtcNow,
                        Modified = DateTime.UtcNow,
                        Name = "y",
                        UserName = "x"
                    };
                    await UserManager.CreateAsync(entity, "fg@123");
                    await UserManager.AddToRoleAsync(entity, RoleConst.Admin);
                    //Send Invitation email to Admin in the Production.
                }
                if(DapperLanguage.All().ToList().Count()==0)
                {
                    await DapperLanguage.AddAsync(new Language
                    {
                        Id = Guid.NewGuid(),
                        Code = LanguageConst.English,
                        Name = "English"
                    });
                    await DapperLanguage.AddAsync(new Language
                    {
                        Id = Guid.NewGuid(),
                        Code = LanguageConst.Arabic,
                        Name = "Arabic"
                    });
                }
            }
            catch (Exception ex)
            {
                LogManager.LogError(JsonConvert.SerializeObject(new { class_name = this.GetType().Name, exception = ex }));
            }
        }

并在 Startup.cs 文件中

public void Configuration(IAppBuilder app, Helpers.SeedHelpers seed)
{
    ConfigureAuth(app);
    seed.Seed().Wait();
}

尝试这种方法。

答案 1 :(得分:0)

如果您正在使用ef core,现在可以在ef映射配置中使用HasData():

https://docs.microsoft.com/en-us/ef/core/modeling/data-seeding

如果使用ef 6,则可以在DbContext上设置一个初始化程序,并且可能将每个实体的种子数据存储在单独的项目中的单独文件中?

http://www.entityframeworktutorial.net/code-first/seed-database-in-code-first.aspx