Entity Framework 6以编程方式更新数据库,没有自动迁移

问题描述 投票:0回答:1

我正在尝试构建一个可以连接到(另一个程序的)现有数据库的应用程序,插入其自己的表结构,并将其更新为上一次迁移。我正在使用代码优先方法。

我正在使用视图,函数和存储过程,这些视图,函数和存储过程是在手动编写的迁移中创建和更新的,因此无法打开自动迁移。我试过了,它的整理工作不再起作用。

我曾尝试过使用DbMigrator,但调用Update()方法似乎无济于事,除了抛出很多sqlerrors。 MigrateDatabaseToLatestVersion初始化程序似乎很有前途,因为它实际上已更新了数据库,但是此后我的应用程序拒绝与数据库连接,基本上告诉我激活自动迁移。

到目前为止,我可以使用的唯一方法是在包管理器控制台中键入'update-database'。我有什么办法可以通过编程方式调用,无论在包管理器控制台中键入“ update-database”时调用什么?

c# sql-server entity-framework entity-framework-6 ef-code-first
1个回答
0
投票

下面的组合现在就像一个咒语:

我已启用迁移功能,但关闭了自动迁移功能。 (启用迁移)

我添加了一些迁移,有些具有自动内容,有些则手动编写。 (add-migration {name})

在“迁移”文件夹中,创建了一个配置,我将其更改为如下所示:

  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);
    }

第一个构造函数仅用于生成内容和创建迁移。对于这些操作,需要一个实际的数据库,所以我只是将连接字符串留给了我数据库在那里。

第二个是应该在该字段中使用的那个,它将把数据库更新到最新版本,无论我以前连接过该数据库还是该数据库只是旧的。我尚未测试它是否会真正创建一个新数据库,如果它不存在,那不是我的用例,但是我认为这可能对您有所帮助,所以我保留了这一行。

[二手实体框架版本:EF6,带有EntityFrameworkExtras.EF6的NuGet软件包版本6.4.0,NuGet软件包版本1.0.0

© www.soinside.com 2019 - 2024. All rights reserved.