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

Posted

技术标签:

【中文标题】在代码优先环境中从包管理器控制台更新数据库【英文标题】:update the database from package manager console in code first environment 【发布时间】:2015-11-18 16:05:07 【问题描述】:

代码优先环境

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

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

命令

PM> Install-Package EntityFramework

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

     PM> Enable-Migrations
    

    通过使用此命令,它在我的项目中创建了迁移文件。

     PM> Update-Database
    

    通过使用这个命令,我可以更新表格,但是我有一个问题

错误

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

疑点来了

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

【问题讨论】:

如其所述,您无法连接。检查 SQL Server 是否正在运行并且您有正确的连接字符串。 我在配置文件中添加了连接字符串 【参考方案1】:

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

【讨论】:

如果我使用这个命令,如果单个 POCO 类发生变化,我可以更新数据库。如果我更改了更多的 Domain calss Field ,我该如何更新? 如果我使用这个命令我得到了以下错误。 脚手架迁移“update1”。此迁移文件的设计器代码包含当前 Code First 模型的快照。此快照用于在您构建下一次迁移时计算对模型的更改。如果您对要包含在此迁移中的模型进行其他更改,则可以通过再次运行“Add-Migration update1”来重新构建它 ,我已经检查过了,第一个用于更新表,但如果我们使用它,如果类不存在,它将更新表。请检查这个。 对我不起作用。输出:更新数据库:找不到与参数名称“ConnectionString”匹配的参数。 @Marcus - 尝试使用 -ConnectionStringName 作为参数。因此,如果您的配置文件中有一个名为 MyConnection 的连接字符串,您的 update-database 命令将如下所示: update-database -ConnectionStringName MyConnection【参考方案2】:

我用过

Enable-Migrations -EnableAutomaticMigrations -Force

然后

Update-Database

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

【讨论】:

【参考方案3】:

您似乎有多个问题。关于不想删除并重新创建数据库,这由您的数据库初始化程序确定。如果要使用迁移,请将其更改为 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>());
    
    ...

【讨论】:

我没有对你投反对票,但在尝试使用你的 sn-p 时出现编译器错误:方法 'System.Data.Entity.Database.SetInitializer(System .Data.Entity.IDatabaseInitializer)' 无法从用法中推断出来。尝试明确指定类型参数 这可以用Database.SetInitializer&lt;ApplicationDbContext&gt;(... 或任何你的上下文类型来纠正。我的工作没有它。【参考方案4】:

连接字符串放在哪里?

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


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

它将用于迁移。

重要提示:如果您的解决方案中有多个项目,您必须在“默认项目”下拉菜单(在包管理器控制台中)选择项目,并且您必须 > 将项目设置为您的启动项目(在解决方案资源管理器中)。

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

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

【讨论】:

设置启动项目对我有用。否则,它正在从另一个项目中读取 appsettings.json 文件。感谢您的提示!【参考方案5】:

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

【讨论】:

投了反对票,即使它不会显示。 Visual Studio 2017 中不存在这样的选项!

以上是关于在代码优先环境中从包管理器控制台更新数据库的主要内容,如果未能解决你的问题,请参考以下文章

EF-使用迁移技术让程序自动更新数据库表结构

如何运行配置类迁移的 Seed() 方法

调试代码优先的实体框架迁移代码

C# 代码优先迁移,向上/向下?

我的Seed()方法永远不会在Code First EF 5中调用

在 PHP CodeIgniter foreach 循环中从数据库中提取和更新数据