【问题标题】:ef core migration insert dataef核心迁移插入数据
【发布时间】:2018-05-21 03:22:33
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

在 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"},
             });
        }

小心:您必须使用迁移来应用更改

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2011-09-14
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 2023-03-14
      相关资源
      最近更新 更多