在代码优先环境中从包管理器控制台更新数据库

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

代码优先环境

我正在尝试从包管理器控制台更新数据库。如果我的域类发生更改,我必须删除并创建数据库。如何更新数据库而不是删除数据库?

命令

  1. 通过使用此命令,我成功安装了实体框架。

    PM> Install-Package EntityFramework
    
  2. 通过使用此命令,它在我的项目中创建了迁移文件。

    PM> Enable-Migrations
    
  3. 通过使用此命令,我可以更新表格,但我在这里遇到问题

    PM> Update-Database
    

错误

指定“-Verbose”标志以查看应用于目标数据库的 SQL 语句。 System.Data.SqlClient.SqlException (0x80131904): 与 SQL Server 建立连接时发生网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。

疑问来了

有时,如果POCO类中只有一个字段发生变化,它可能会更新。例如,我更新了更多数量的 Domain 类。如何从包管理器控制台更新数据库?

c# sql-server visual-studio-2012 entity-framework-6 entity-framework-migrations
7个回答
31
投票

您可以通过

ConnectionString
参数指定连接字符串:

Update-Database -ConnectionString "data source=server_name;initial catalog=db_name;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" -ConnectionProviderName "System.Data.SqlClient" -Verbose

您还需要将此参数与

Add-Migration
命令使用相同的值:

Add-Migration Version_Name -ConnectionString "data source=server_name;initial catalog=db_name;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" -ConnectionProviderName "System.Data.SqlClient" -Verbose

8
投票

我用过

Enable-Migrations -EnableAutomaticMigrations -Force

然后

Update-Database

这迁移了我的更改(附加列),同时保留了我的测试数据。我认为这是原型设计时最懒的选择。


2
投票

您似乎有多个问题。关于不想删除并重新创建数据库,这是由数据库初始值设定项决定的。如果您想使用迁移,请将其更改为 MigrateDatabaseToLatestVersion。 http://www.codeguru.com/csharp/article.php/c19999/Understanding-Database-Initializers-in-Entity-Framework-Code-First.htm

其次,无论您更改多少字段,它们都会根据上次迁移的更改汇总到单个迁移中。

第三,正如其他人指出的那样,您似乎遇到了连接字符串问题。虽然您可以将其添加到 Add-Migration 和 Update-Migration 中,但我可能会在应用程序中修复它。我在上下文的构造函数中设置了我的,它指向我的配置文件(ASP.NET 的 web.config)。

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext()
        : base("MyConnection", throwIfV1Schema: false)
    {
        Database.SetInitializer<ApplicationDbContext>(new MigrateDatabaseToLatestVersion<ApplicationDbContext, MyObjextContextMigration>());
    }
    ...

2
投票

连接字符串放在哪里?

您不需要在包管理器控制台中的每个命令中指定它。您可以将其放在 DbContext 类(读取“来自 DbContext 派生类”)所在项目的 appsettings.json 中。

{
  "ConnectionStrings": {
    "MyConnectionString": "Server=yourServer;Port=5432;Database=yourDatabase;User Id=yourDatabaseUsername;Password=yourDatabasePassword;"
  }
}

它将用于迁移。

重要提示:如果解决方案中有多个项目,则必须在“默认项目”下拉列表中选择该项目(在包管理器控制台中),并且必须将该项目设置为启动项目(在解决方案中)探索者)。

如果不这样做,可能会导致错误的 appsettings.json 与不正确/不同的连接字符串一起使用。

这是我使用 EF Core 2.1 的经验,可能也适用于其他版本的 EF。


0
投票

您需要更新SSDT 转到工具>扩展和更新>更新> SQL Server数据工具


0
投票

我只是使用 update-database -Force

配置完Code First数据库后,在数据库更新过程中可能会丢失数据。对于 -Force,我们会考虑到这一点。


0
投票

我的解决方案可能会帮助某人: 在“连接服务”下删除 localdb。 然后右键单击“连接服务”并单击“添加”。 选择数据库。 接下来,它将询问连接字符串名称 ConnectionStrings:默认保留名称 连接字符串值命中...提供信息并测试连接 迁移现在应该可以工作了。

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