ef核心迁移插入数据

时间:2017-12-07 05:04:22

标签: asp.net entity-framework asp.net-core

我想在迁移中将数据插入表中。可能吗?迁移需要无参数构造函数,我想使用Startup.cs文件中定义的db上下文(我最好通过依赖注入来获取它)。怎么样?

2 个答案:

答案 0 :(得分:3)

在EF Core 2.1中,迁移可以自动计算插入,更新或删除的内容

将数据库升级到模型的新版本时,必须应用

操作。

例如,我们有一个User和UserComment实体,如下所示:

public class User
  {
      public int UserId { get; set; }
      public string Name { get; set; }
      public List<UserComment> UserComments { get; set; }
  }

public class UserComment
  {
      [Key]
      public int CommentId { get; set; }
      public string CommentTitle { get; set; }
      [ForeignKey("User")]
      public int FKUserId { get; set; }
      public User User { get; set; }
  }

在DBContext中,重写OnModelCreating函数并将数据种子添加到每个实体:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>().HasData(new User[] {
                new User{UserId=1,Name="iman"},
                new User{UserId=2,Name="Alex"},
            });
        }

要播种具有关系的数据,必须指定外键值:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
             modelBuilder.Entity<UserComment>().HasData(new UserComment[] {
                 new UserComment{FKUserId=1,CommentId=1,CommentTitle="Comment1"},
             });
        }

注意:您必须使用迁移来应用更改

答案 1 :(得分:1)

迁移是一个&#34;升级&#34;你的数据库是一个新的&#34;版本&#34;。在此期间,您现有的数据库表(&#34;旧版本&#34;)不需要与您的类(实体)匹配(&#34;新版本&#34;),因此您无法安全地使用它们

在迁移期间,您应该只使用原始SQL命令操作表和记录。您可以使用migrationBuilder.Sql("UPDATE ...");进行此类更新,将其手动放入迁移Up()代码中。

如果您需要使用实体类执行数据修改 - 您应该使用"Seed Data" solution(来自 @itikhomi 评论),但请记住它会在您的应用每次启动时运行,因此您应该在里面做一些版本检查。