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

update the database from package manager console in code first environment

代码优先环境

我正在尝试从包管理器更新数据库 console.If 我的域 class 更改,我必须删除并创建数据库,而不是删除数据库 我该如何更新数据库.

我已经尝试阅读 google 中的一些博客。

命令

PM> Install-Package EntityFramework
  1. 通过使用此命令,我成功安装了 Entity Framework。

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

     PM> Update-Database
    
  3. 通过使用此命令,我可以更新 table 但我在此处遇到 问题

错误

Specify the '-Verbose' flag to view the SQL statements being applied to the target database. System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections.

疑问来了

有时 POCO Class 中只有一个字段发生变化,它可能会更新。例如,我已经更新了 更多的域 class,我如何从包管理器控制台更新数据库。有什么想法吗?

您可以通过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

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

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

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

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

我用过

Enable-Migrations -EnableAutomaticMigrations -Force

然后

Update-Database

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

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

将连接字符串放在哪里?

您不需要在包管理器控制台中为每个命令指定它。你可以把它放在你的DbContext class(读取"from DbContext derived class")所在项目的appsettings.json中。

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

它将用于迁移。

重要提示:如果您的解决方案中有多个项目,您 必须 select 'Default project'-下拉列表中的项目(在程序包管理器控制台中) 并且您必须 将该项目设置为您的启动项目(在解决方案资源管理器中)。

否则,可能会导致错误的 appsettings.json 与 incorrect/different 连接字符串一起使用。

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