在DbMigration中访问Up中的上下文

时间:2015-05-13 00:27:28

标签: c# sql-server entity-framework

我尝试根据当前数据库中的数据迁移数据库。我很难查询数据库以获取信息以允许我这样做。我理想的解决方案看起来像

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 

干净。因此,为了让他们干净利落地更新并让每个人都免费,我想查询迁移历史表,查看它是否是混乱,如果是这样,删除所有历史记录并跳过实际迁移,但仍然填充表中的迁移行。

2 个答案:

答案 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");
    }
}

......或其中的一些变体。

请参阅:DropColumn conditionally in a migration

答案 1 :(得分:1)

在应用迁移之前,无法创建上下文,因此您无法访问它。您可以使用普通的ADO.NET方法来查询数据库。

我建议的是将Seed方法中的代码放入数据库初始化程序中。应用每次迁移后都会运行Seed,并且是迁移发生时执行数据库维护的正确位置。您可以创建一个空迁移,然后在种子中检查条件是否适合您做任何想做的事情。

如果你更具体地解释了你想要做的事情,那可能会有所帮助。