运行代码首先从另一个项目中迁移

时间:2015-02-05 15:56:53

标签: c# entity-framework entity-framework-6 ef-migrations

我有一个不寻常的问题,我会尽力解释。

我有一个WebAPI项目,它使用Entity Framework迁移。这一切都与以下设置完美配合。 webapi项目引用了我的存储库项目,其中包含MyContext,我的所有迁移文件和所有迁移配置

WebAPI项目中的Global.asax.cs

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Repositories.Migrations.Configuration>());

存储库项目中的Configuration.cs

public sealed class Configuration : DbMigrationsConfiguration<MyContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        AutomaticMigrationDataLossAllowed = true;
    }

    public Configuration(DbConnectionInfo _info)
    {
        AutomaticMigrationsEnabled = false;
        AutomaticMigrationDataLossAllowed = true;
        TargetDatabase = _info;
    }

    protected override void Seed(MyContext _context)
    {
        MyContextSeeder.Seed(_context, logger);
        base.Seed(_context);
    }
}

我还有一个方法可以根据传入的连接字符串创建一个带有新上下文的新数据库。这在我的WebAPI项目中非常有效,并且可以动态调用它来创建数据库并将它们迁移到最新。

public static MyContext UpdateDatabase(string _connectionString)
    {
        try
        {
            var context = new MContext(_connectionString);
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
            DbMigrator migrator = new DbMigrator(new Configuration(new DbConnectionInfo(context.Database.Connection.ConnectionString, "System.Data.SqlClient")));
            migrator.Update();
            return context;
        }
        catch (Exception err)
        {
            logger.Error("Error updating database", err);
            throw;
        }
    }

我现在要完成的任务是从另一个完全独立的应用程序运行这些迁移。 到目前为止,我已设法运行迁移,并且正在创建数据库并运行迁移(但应注意,种子似乎没有被调用),但它报告错误:

Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration.

在这个单独的应用程序中,这是一个Windows窗体应用程序,我基本上完成的是包括对我的存储库项目的引用(以及其他相关项目,例如模型),并调用上面详述的UpdateDatabase方法。

因此,表单应用程序中的代码可以淡化为:

private void btnSubmit_Click(object sender, EventArgs e)
{  
    MyContext.UpdateDatabase(newConnectionString);
}

有没有人有过开发过类似事情的经验,或者我是否采取了错误的方式?我想要实现的目标似乎很简单,但就是不完全存在。

0 个答案:

没有答案