在代码优先环境中从包管理器控制台更新数据库
代码第一环境
我正在尝试从包管理器控制台更新数据库。如果我的Domain类发生更改,我必须删除并创建数据库,而不是删除数据库,我如何更新数据库。
我已经尝试通过阅读谷歌的一些博客。
命令
PM> Install-Package EntityFramework
-
通过使用此命令,我成功安装了Entity Framework。
PM> Enable-Migrations
-
通过使用此命令,它在我的项目中创建了迁移文件。
PM> Update-Database
-
通过使用此命令,我可以更新表,但我有一个问题 。
错误
指定’-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。