我想在迁移中将数据插入表中。可能吗?迁移需要无参数构造函数,我想使用Startup.cs文件中定义的db上下文(我最好通过依赖注入来获取它)。怎么样?
答案 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 评论),但请记住它会在您的应用每次启动时运行,因此您应该在里面做一些版本检查。