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

代码第一环境

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

我已经尝试通过阅读谷歌的一些博客。

命令

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

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

      PM> Update-Database 
  3. 通过使用此命令,我可以更新表,但我有一个问题

错误

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

怀疑就在这里

有时如果POCO类中只有一个字段发生变化,它可能会更新。 例如,我已经更新了更多的Domain类 ,如何从Package Manager Console更新数据库。 任何的想法 ?

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

我用了

Enable-Migrations -EnableAutomaticMigrations -Force

然后

Update-Database

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

看起来你有很多问题。 关于不想删除和重新创建数据库,这是由数据库初始化程序确定的。 如果要使用迁移,请将其更改为MigrateDatabaseToLatestVersion。 http://www.codeguru.com/csharp/article.php/c19999/Understanding-Database-Initializers-in-Entity-Framework-Code-First.htm

其次,无论您更改了多少个字段,它们都将根据上次迁移的更改进行单个迁移。

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

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

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

在哪里放连接字符串?

您无需在包管理器控制台中使用每个命令指定它。 您可以将它放在appbtings.json中,在DbContext类(从“DbContext派生类”中读取)所在的项目中。

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

它将用于迁移。

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

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

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