ef核心迁移插入数据

Mar*_*rek 9 asp.net entity-framework asp.net-core

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

Ima*_*our 9

在 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; }
  }
Run Code Online (Sandbox Code Playgroud)

在 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"},
            });
        }
Run Code Online (Sandbox Code Playgroud)

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

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

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


Dmi*_*try 5

迁移是将您的数据库“升级”到新“版本”的过程。在此期间,您现有的数据库表(“旧版本”)不需要匹配您的类(实体)(“新版本”),因此您不能安全地使用它们。

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

如果您需要使用实体类执行数据修改 - 您应该使用“种子数据”解决方案(来自@itikhomi评论),但请记住它会在您的应用程序每次启动时运行,因此您应该在其中进行一些版本检查。