我正在尝试迁移仅在运行时已知的数据库,这意味着我无法使用程序包管理器控制台来更新数据库。此外,它不仅仅是一个,而是许多数据库,但它们都适用于所有数据库:)
我正在使用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;
}
当检索上下文时,该方法创建一个连接字符串并将其作为参数传递给MyEntities
的构造函数。我还在方法中指定了我想要的迁移类型(在本例中为MigrateDatabaseToLatestVersion
)。
迁移代码如下:
public partial class MyAccountInMonth : DbMigration
{
public override void Up()
{
AlterColumn("AccountsInMonths", "MovementDebtMonth", c => c.Long(nullable: false));
AlterColumn("AccountsInMonths", "MovementCreditMonth", c => c.Long(nullable: false));
AlterColumn("AccountsInMonths", "BalanceMonth", c => c.Long(nullable: false));
AlterColumn("AccountsInMonths", "MovementDebtAccumulated", c => c.Long(nullable: false));
AlterColumn("AccountsInMonths", "MovementCreditAccumulated", c => c.Long(nullable: false));
AlterColumn("AccountsInMonths", "BalanceAccumulated", c => c.Long(nullable: false));
}
public override void Down() { /* Code omitted */ }
}
运行应用程序时,会出现以下错误:
Cannot find the object "AccountsInMonths" because it does not exist or you do not have permissions.
迁移的作用是将列AccountsInMonths
的类型从int
更改为long
。
这是一个迁移错误,因为堆栈跟踪已经调用它。此时我只能认为问题可以是权限,因为表存在。其他可能性是连接字符串上的某种问题。拜托,有人知道这个吗?提前谢谢!
PS:如果不清楚我可以在问题中添加更多信息。
答案 0 :(得分:3)
我有几个问题。这是解决方案:
1)将你的Configuration
作为公共课:
public sealed class Configuration : DbMigrationsConfiguration<YourContextClassHere>
2)将Seed()方法设为公共
2)添加以下代码的任何位置,这将应用最新的迁移并更新您的db:
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());
答案 1 :(得分:2)
要在Visual Studio和程序包管理器控制台之外迁移数据库,请使用随附的 migrate.exe 工具,该工具位于EntityFramework nuget包中。它基本上允许您从命令行执行相同的迁移。
答案 2 :(得分:1)
您可以将程序包管理器控制台与Update-Database
一起使用。它有一个开关来指定连接字符串 - 连接字符串本身($ConnectionString
和$ConnectionProviderName
)或从配置($ConnectionStringName
)中命名一个。
或者你可以使用DbMigrator
类在代码中自己处理它(类似于实际上migrate.exe
正在做的事情)。