C# 实体框架代码优先:迁移仅在运行时已知的数据库

C# 实体框架代码优先:迁移仅在运行时已知的数据库,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,我正在尝试迁移一个只有在运行时才知道的数据库,这意味着我无法使用PackageManager控制台来更新数据库。而且它不仅是一个数据库,而且是多个数据库,但对所有数据库来说都是相同的模式:) 我使用Ninject在DbContext对象上生成并注入连接字符串。上下文构造函数如下所示: public class MyEntities : DbContext { public MyEntities(string database) : base(database) { } /* Pr

我正在尝试迁移一个只有在运行时才知道的数据库,这意味着我无法使用PackageManager控制台来更新数据库。而且它不仅是一个数据库,而且是多个数据库,但对所有数据库来说都是相同的模式:)

我使用Ninject在
DbContext
对象上生成并注入连接字符串。上下文构造函数如下所示:

public class MyEntities : DbContext
{
    public MyEntities(string database) : base(database) { }
    /* Properties code omitted. */
}
实例化上下文的方法如下所示:

public MyEntities GetDatabase(string databaseName, string connectionString)
{
    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
    builder.InitialCatalog = databaseName;

    MyEntities context = this._kernel.Get<MyEntities>(new ConstructorArgument(
        "database", builder.ConnectionString));

    Database.SetInitializer<MyEntities>(
        new MigrateDatabaseToLatestVersion<MyEntities, MyEntitiesMigrationConfiguration>("MyEntities"));

    return context;
}
运行应用程序时,出现以下错误:

Cannot find the object "AccountsInMonths" because it does not exist or you do not have permissions.
迁移所做的是将列
AccountsInMonths
的类型从
int
更改为
long

这是一个迁移错误,因为堆栈跟踪有对它的调用。此时,我只能认为问题可能是权限,因为表存在。另一种可能性是连接字符串上存在某种问题。拜托,有人有线索吗?提前谢谢


PS:如果不清楚,我可以为问题添加更多信息。

要在Visual Studio和软件包管理器控制台之外迁移数据库,请使用EntityFramework nuget软件包中附带的migrate.exe工具。它基本上允许您从命令行执行相同的迁移。

您可以将包管理器控制台与
更新数据库一起使用。它有一个开关来指定连接字符串-连接字符串本身(
$ConnectionString
$ConnectionProviderName
)或从配置中命名的连接字符串(
$ConnectionString


或者您可以使用
DbMigrator
类自己在代码中处理它(类似于
migrate.exe的实际操作)。

我有几个问题。以下是解决方案:

1) 将您的
配置
设置为公共类:

public sealed class Configuration : DbMigrationsConfiguration<YourContextClassHere>

我可以用SQL Azure数据库做到这一点吗?尚未尝试。然而我希望如此,因为它只是Sql Server上的一个变体。现在它是一个很好的解决方案,因为我正处于开发阶段。但是,如果将来发生这种情况,可能是不可行的,因为有1个数据库可供访问(希望有很多人访问)。因此,例如,对于1000次访问,将有1000个数据库,而您的解决方案不是最好的。但现在这是一个很好的建议:)谢谢@jmpcm我在我的答案中添加了一个关于
DbMigrator
类的注释,也许这可以帮助您批量完成。谢谢您的建议!当我在我的老公司做一个项目时,这个问题就出现了。不幸的是,我不能尝试你建议的这种方法,所以我让它向其他有同样问题的人开放!
public sealed class Configuration : DbMigrationsConfiguration<YourContextClassHere>
Configuration configuration = new Configuration();
configuration.ContextType = typeof(YourContextClassHere);
var migrator = new DbMigrator(configuration);

// This will update the schema of the DB
migrator.Update();
// This will run Seed() method
configuration.Seed(new YourContextClassHere());