Entity Framework 6 以编程方式更新数据库没有自动迁移
Entity Framework 6 update database programmatically no automatic migration
我正在尝试构建一个可以连接到(另一个程序的)现有数据库的应用程序,插入它自己的 table 结构并将其更新到上次迁移。我正在使用代码优先的方法。
我正在使用在手动编写的迁移中创建和更新的视图、函数和存储过程,因此无法打开自动迁移。我试过了,它直接不再起作用了。
我尝试使用 DbMigrator,但是调用 Update() 方法似乎什么也没做,除了抛出很多 sqlerror。 MigrateDatabaseToLatestVersion 初始化程序看起来很有前途,因为它实际上更新了数据库,但之后我的应用程序拒绝连接数据库,基本上告诉我激活自动迁移。
到目前为止,我可以使用数据库的唯一方法是在程序包管理器控制台中键入 'update-database'。
有什么方法可以让我以编程方式调用,无论我在包管理器控制台中键入 'update-database' 时调用什么?
以下组合现在很有魅力:
我启用了迁移,但关闭了自动迁移。 (启用迁移)
我添加了几个迁移,一些是自动内容,一些是手动编写的。 (添加迁移 {name})
在 Migrations 文件夹中,创建了一个配置,我将其更改为如下所示:
internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = false;
ContextKey = "MyDbContext";
}
protected override void Seed(StratonLocalizerDatabase context)
{
// This method will be called after migrating to the latest version.
// You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data.
}
}
我的 DbContext 的构造函数如下所示:
public class MyDbContext: DbContext
{
[Obsolete("This constructor should never be used directly, and is only needed to generate entityframework stuff. Connection string can be adapted as pleased.")]
public MyDbContext() : base(@"Server=MyServer\Instance;Database=MyDatabase;Trusted_Connection=True;")
{
}
public MyDbContext(string connectionString) : base(connectionString)
{
Database.CreateIfNotExists();
Database.SetInitializer(new MigrateDatabaseToLatestVersion<StratonLocalizerDatabase, Migrations.Configuration>());
Database.Initialize(false);
}
第一个构造函数仅用于生成内容和创建迁移。对于这些操作,需要一个实际的数据库,所以我只留下了我的连接字符串
那里的数据库。
第二个是应该在现场使用的那个,它会将数据库更新到最新版本,无论我之前是否连接过该数据库或者该数据库是否旧。我还没有测试它是否真的会创建一个新的数据库,如果它不存在,那不是我的用例,但我认为这可能对你们有帮助,所以我保留了这一行。
使用的 Entity Framework 版本:EF6,NuGet 包版本 6.4.0 和 EntityFrameworkExtras.EF6,NuGet 包版本 1.0.0
我正在尝试构建一个可以连接到(另一个程序的)现有数据库的应用程序,插入它自己的 table 结构并将其更新到上次迁移。我正在使用代码优先的方法。
我正在使用在手动编写的迁移中创建和更新的视图、函数和存储过程,因此无法打开自动迁移。我试过了,它直接不再起作用了。
我尝试使用 DbMigrator,但是调用 Update() 方法似乎什么也没做,除了抛出很多 sqlerror。 MigrateDatabaseToLatestVersion 初始化程序看起来很有前途,因为它实际上更新了数据库,但之后我的应用程序拒绝连接数据库,基本上告诉我激活自动迁移。
到目前为止,我可以使用数据库的唯一方法是在程序包管理器控制台中键入 'update-database'。 有什么方法可以让我以编程方式调用,无论我在包管理器控制台中键入 'update-database' 时调用什么?
以下组合现在很有魅力:
我启用了迁移,但关闭了自动迁移。 (启用迁移)
我添加了几个迁移,一些是自动内容,一些是手动编写的。 (添加迁移 {name})
在 Migrations 文件夹中,创建了一个配置,我将其更改为如下所示:
internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = false;
ContextKey = "MyDbContext";
}
protected override void Seed(StratonLocalizerDatabase context)
{
// This method will be called after migrating to the latest version.
// You can use the DbSet<T>.AddOrUpdate() helper extension method
// to avoid creating duplicate seed data.
}
}
我的 DbContext 的构造函数如下所示:
public class MyDbContext: DbContext
{
[Obsolete("This constructor should never be used directly, and is only needed to generate entityframework stuff. Connection string can be adapted as pleased.")]
public MyDbContext() : base(@"Server=MyServer\Instance;Database=MyDatabase;Trusted_Connection=True;")
{
}
public MyDbContext(string connectionString) : base(connectionString)
{
Database.CreateIfNotExists();
Database.SetInitializer(new MigrateDatabaseToLatestVersion<StratonLocalizerDatabase, Migrations.Configuration>());
Database.Initialize(false);
}
第一个构造函数仅用于生成内容和创建迁移。对于这些操作,需要一个实际的数据库,所以我只留下了我的连接字符串 那里的数据库。
第二个是应该在现场使用的那个,它会将数据库更新到最新版本,无论我之前是否连接过该数据库或者该数据库是否旧。我还没有测试它是否真的会创建一个新的数据库,如果它不存在,那不是我的用例,但我认为这可能对你们有帮助,所以我保留了这一行。
使用的 Entity Framework 版本:EF6,NuGet 包版本 6.4.0 和 EntityFrameworkExtras.EF6,NuGet 包版本 1.0.0