如何将数据播种到已创建的数据库中?

Posted

技术标签:

【中文标题】如何将数据播种到已创建的数据库中?【英文标题】:How can I seed data to already created database? 【发布时间】:2017-06-06 16:03:06 【问题描述】:

我正在创建一个足球经理游戏。我使用了身份 2.0,因为它适用于我的注册和登录。我能够添加所需的额外表格,但现在我需要将球队和球员等数据播种到这些表格中。知道怎么做吗?额外的表是使用迁移在身份模型中创建的。这是我正在使用的表格的图片。

【问题讨论】:

要种子身份,请参阅here。关于其他表,见here 【参考方案1】:

在 Migrations 文件夹中,有一个名为 Configuration.cs 的文件,其中包含可用于创建一些种子数据的 Seed 方法。

protected override void Seed(ApplicationDbContext context)

    //  This method will be called after migrating to the latest version.

    //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
    //  to avoid creating duplicate seed data. E.g.

    //add roles
    context.Roles.AddOrUpdate(p => p.Id,
        new IdentityRole()
        
            Id = EnumUtility<AspNetRoles>.GetAppRoleId(AspNetRoles.None),
            Name = AspNetRoles.None.ToString()
        );

只需运行 update-database,您的表中就应该有数据了。

【讨论】:

【参考方案2】:

有 2 种 Seed() 方法可用 - 一种在某些初始化程序中,例如在创建数据库时运行的 CreateDatabaseIfNotExist。另一个是migration Seed(),只要您通过update-database 应用迁移,它就会运行。

由于它在每次迁移时都会运行,因此您需要确保不会复制数据。您可以通过检查是否存在来做到这一点:

if (!context.Teams.Any())

     context.Teams.Add(new Team  Name = "Team A" );
     context.Teams.Add(new Team  Name = "Team B" );


但是有一种专门为迁移设计的更好的方法,称为AddOrUpdate:

protected override void Seed(ApplicationDbContext context)

    context.Teams.AddOrUpdate(
        team => team.Id,   // put the key or unique field here
        new Team
        
            Id = 1,
            Name = "Team 1"
        ,
        new Team
        
            Id = 2,
            Name = "Team 2"
        );

    context.SaveChanges();

【讨论】:

以上是关于如何将数据播种到已创建的数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

创建 AES 密钥比播种 SecureRandom 更好的方法

我应该如何在 Entity Framework 6 中播种数据

将用户添加到已创建的数据库 - 授予完全读取权限

如何使用 Entity Framework Code First 让我的数据库播种?

EF 代码优先 - 删除然后创建数据库后播种

如何使用数据库将数据从一个表导入另一个表:播种? (laravel 5.3)?