gpt4 book ai didi

vb.net - 使用Code-First进行Update-Database时出错:“数据库中已经存在一个名为'something'的对象。”

转载 作者:行者123 更新时间:2023-12-04 16:45:53 27 4
gpt4 key购买 nike

我正在Visual Studio 2015中使用Code-First进行数据库迁移。在此过程中,我已经完成了迁移步骤,直到Add-Migration为止。

添加迁移之后,我添加了这一行代码

Database.SetInitializer(New MigrateDatabaseToLatestVersion(Of DbContext1, Migrations.Configuration))


在我的DbContext构造函数中设置数据库初始化程序,因为我之前错过了此步骤。之后,我执行了

"Add-Migration initial -Force"


在Package Manager控制台中,因为我担心在Add-Migration过程中需要此部分。然后,我直接执行

"Update-Database"


问题是我这样做之后,出现错误


此操作需要连接到“ master”数据库。由于原始数据库连接已打开并且凭据已从连接字符串中删除,因此无法创建与“ master”数据库的连接。提供未打开的连接。


添加

重新启动计算机后,执行“ Update-Database”时不再出现上述错误。相反,出现了另一个错误:


数据库中已经有一个名为“ something”的对象。


我看到一个建议执行的答案线程

Add-Migration Initial -IgnoreChanges


其次是

Update-Database -verbose


我都尝试过,但仍然显示相同的错误。

最佳答案

为了能够解决问题,您应该了解EF如何处理连接字符串以及迁移的工作方式。

EF如何处理连接字符串:通常,您的DbContext具有无参数构造函数,该构造函数使用硬编码的连接字符串名称调用其基类构造函数。您的项目app.configweb.config文件应包含connectionStrings部分,该部分定义具有该名称的连接字符串。当您未明确向Package Manager控制台命令提供连接字符串参数时,这是项目中使用的默认连接字符串。

连接字符串名称为MyConnectionStringName的一些示例代码:

public class MyDbContext : DbContext
{
public MyDbContext() : base("MyConnectionStringName") { ... }
...
}


并在您的 .config文件中:

<configuration>
...
<connectionStrings>
<add name="MyConnectionStringName" connectionString="..." />
</connectionStrings>
</configuration>


如果不使用该方法,则仍然可以在Package Manager控制台中手动为 Update-Database提供正确的连接字符串作为参数,如下所示:

Update-Database -ConnectionString <your connection string here> -ConnectionProviderName System.Data.SqlClient


您还可以使用在 .config文件中定义的任何连接字符串名称:

Update-Database -ConnectionStringName MyConnectionStringName


现在介绍迁移的工作方式:迁移是代码文件。每次运行 Add-Migration时,通常会在项目内部的一个名为 Migrations的文件夹中生成/更新代码文件。迁移文件的名称由其生成的时间戳和运行 Add-Migration时使用的名称组成。您可以检查那些文件的内容,并查看运行 Add-Migration的效果。您也可以在生成它们后对其进行修改,并添加自己的代码,尽管目前您无需这样做。

迁移旨在逐步进行。从 Initial迁移开始,每次更改模型代码时,都会生成一个新的迁移文件。该数据库包含一个名为 __MigrationsHistory的表,该表可跟踪数据库中已运行的迁移。

每个迁移都具有方法 Up和方法 Down。运行 Update-Database时,总是有两个隐式参数: SourceMigrationTargetMigration。 EF以增量方式应用 UpSourceMigration之间的所有迁移的 TargetMigration方法(如果要降级数据库,则使用 Down方法)。当您不指定 SourceMigrationTargetMigration参数时,默认方案是 SourceMigration是应用于数据库的最后一次迁移,而 TargetMigration是挂起的最后一个迁移。 EF通过查询项目默认数据库的 __MigrationsHistory表来确定这些参数,因此,如果该数据库处于不一致状态,则可能会错误地生成迁移。我认为这是导致您出现问题的原因。

因此,每次运行 Update-Database时,EF都会根据数据库的状态查看 __MigrationsHistory表以了解必须运行哪些迁移,并且在执行迁移的SQL之后,每个表都会在该表中插入一条新记录。应用的迁移。

似乎您的数据库 __MigrationsHistory内容有时被弄乱了。在运行 Update-DatabaseAdd-Migrations而不遵循正确的顺序并使用 -force参数时,会发生这种情况。

我的解决问题的建议:从头开始:删除数据库,删除迁移文件,使用 Initial生成新的干净的 Add-Migration Initial迁移,使用 Update-Database仅运行一次。从那时起,每次更改模型代码时,都会使用 Add Migration YourNewMigrationName生成新的增量迁移,每次使用不同的名称,并通过运行 Update-Database一次应用新迁移。

注意:如果您不了解增量迁移,则如果您对迁移的工作方式有足够的了解,则也可以仅使用一次 Initial迁移,并在模型代码更改时通过执行 Add-Migrations Initial -force对其进行更新。 -force参数确保现有的 Initial迁移文件将被覆盖,而不是生成新的迁移文件。这种方法在开发阶段很方便,但是在生产中通常不是一个好方法,因为您可能希望在每次部署新版本的代码时逐步运行数据库更新(您可能无法删除数据库)并再次创建它,并且您还需要维护数据并确保在更新数据库时没有数据丢失。

迁移是由EF生成的用于创建和更新数据库的代码文件。运行 Update-Database时,迁移将转换为对数据库执行的SQL。如果要查看为特定迁移生成的确切SQL,可以运行 Update-Database -Script -SourceMigration SomeMigration -TargetMigration SomeOtherMigration。该命令不会修改数据库,只会生成并显示将在实际 Update-Database执行中应用的SQL。

可以在 here中找到有关生成和运行迁移的更多信息。

祝好运!

关于vb.net - 使用Code-First进行Update-Database时出错:“数据库中已经存在一个名为'something'的对象。”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40606167/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com