我尝试根据当前数据库中的数据迁移数据库。我很难查询数据库以获取信息以允许我这样做。我理想的解决方案看起来像
public partial class Reset: DbMigration
{
public override void Up()
{
string SqlCmd = "my query";
if(Execute(SqlCmd) > 5)
{
//do this migration
}
}
}
所以我在迁移过程中遇到数据问题。
修改
你们很多人都在想我为什么要这么做,所以我会给你们一些讨厌的细节。
因此,随着我们项目的发展,我们的数据库迁移历史也在增长。我们的迁移历史记录表中有200多行。我们将db拆分并在此处进行了一些维护,以便从头开始使用空db运行所有迁移将导致错误,因为某些表尚未创建。是的,它是一个巨大的混乱,这就是为什么我想要清理它。我在SO to reset the migrations to a clean slate.上遇到了这个帖子。我没有使用接受的答案,因为我们的迁移混乱不会让它发挥作用。因此使用了第二高的答案。这个选择的解决方案的唯一问题是,对于团队中的每个开发人员,您必须指出他们更新数据库或让他们下载最新数据库的指令。他们无法做到
update-database
干净。因此,为了让他们干净利落地更新并让每个人都免费,我想查询迁移历史表,查看它是否是混乱,如果是这样,删除所有历史记录并跳过实际迁移,但仍然填充表中的迁移行。
答案 0 :(得分:3)
如果你真的想要做你想要的,你可以在你的迁移中执行T-SQL,例如:
public partial class Reset: DbMigration
{
public override void Up()
{
Sql(@"
DECLARE @result int
SELECT @result = <query>
IF (@result > 5)
BEGIN
<migration stuff>
END");
}
}
......或其中的一些变体。
答案 1 :(得分:1)
在应用迁移之前,无法创建上下文,因此您无法访问它。您可以使用普通的ADO.NET方法来查询数据库。
我建议的是将Seed方法中的代码放入数据库初始化程序中。应用每次迁移后都会运行Seed,并且是迁移发生时执行数据库维护的正确位置。您可以创建一个空迁移,然后在种子中检查条件是否适合您做任何想做的事情。
如果你更具体地解释了你想要做的事情,那可能会有所帮助。