数据库中已经有一个名为

更新-数据库从包管理器控制台失败。 我使用了实体框架6.x 和代码优先的方法。 错误是

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

我怎样才能解决这个问题?

internal sealed class Configuration
: DbMigrationsConfiguration<Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = false;
}


protected override void Seed(Jahan.Blog.Web.Mvc.Models.JahanBlogDbContext context)
{


}
}

我的 DbContext 是:

public class JahanBlogDbContext : IdentityDbContext<User, Role, int, UserLogin, UserRole, UserClaim>
{
public JahanBlogDbContext()
: base("name=JahanBlogDbConnectionString")
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<JahanBlogDbContext>());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Comment>().HasRequired(t => t.Article).WithMany(t => t.Comments).HasForeignKey(d => d.ArticleId).WillCascadeOnDelete(true);
base.OnModelCreating(modelBuilder);


modelBuilder.Entity<User>().ToTable("User");
modelBuilder.Entity<Role>().ToTable("Role");
modelBuilder.Entity<UserRole>().ToTable("UserRole");
modelBuilder.Entity<UserLogin>().ToTable("UserLogin");
modelBuilder.Entity<UserClaim>().ToTable("UserClaim");
}


public virtual DbSet<Article> Articles { get; set; }
public virtual DbSet<ArticleLike> ArticleLikes { get; set; }
public virtual DbSet<ArticleTag> ArticleTags { get; set; }
public virtual DbSet<AttachmentFile> AttachmentFiles { get; set; }
public virtual DbSet<Comment> Comments { get; set; }
public virtual DbSet<CommentLike> CommentLikes { get; set; }
public virtual DbSet<CommentReply> CommentReplies { get; set; }
public virtual DbSet<ContactUs> ContactUs { get; set; }
public virtual DbSet<Project> Projects { get; set; }
public virtual DbSet<ProjectState> ProjectStates { get; set; }
public virtual DbSet<ProjectTag> ProjectTags { get; set; }
public virtual DbSet<Rating> Ratings { get; set; }
public virtual DbSet<Tag> Tags { get; set; }
public virtual DbSet<AboutUs> AboutUs { get; set; }
}

软件包管理控制台:

PM> update-database -verbose -force
Using StartUp project 'Jahan.Blog.Web.Mvc'.
Using NuGet project 'Jahan.Blog.Web.Mvc'.
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Target database is: 'Jahan-Blog' (DataSource: (local), Provider: System.Data.SqlClient, Origin: Configuration).
No pending explicit migrations.
Applying automatic migration: 201410101740197_AutomaticMigration.
CREATE TABLE [dbo].[AboutUs] (
[Id] [int] NOT NULL IDENTITY,
[Description] [nvarchar](max),
[IsActive] [bit] NOT NULL,
[CreatedDate] [datetime],
[ModifiedDate] [datetime],
CONSTRAINT [PK_dbo.AboutUs] PRIMARY KEY ([Id])
)
System.Data.SqlClient.SqlException (0x80131904): There is already an object named 'AboutUs' in the database.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext)
at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery()
at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement, DbInterceptionContext interceptionContext)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbTransaction transaction, DbInterceptionContext interceptionContext)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable`1 migrationStatements, DbConnection connection)
at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass30.<ExecuteStatements>b__2e()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements, DbTransaction existingTransaction)
at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, IEnumerable`1 systemOperations, Boolean downgrading, Boolean auto)
at System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, VersionedModel sourceModel, VersionedModel targetModel, Boolean downgrading)
at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
ClientConnectionId:88b66414-8776-45cd-a211-e81b2711c94b
There is already an object named 'AboutUs' in the database.
PM>
274078 次浏览

在迁移过程中似乎出现了一个问题,在“ Package Manager Console”中运行 add- 迁移命令:

Add-迁移初始化-忽略更改

做一些修改,然后从“初始”文件更新数据库:

更新-数据库-详细

编辑: IgnoreChanges 在 EF6中,但不在 EF 核中,这里有一个变通方法: Https://stackoverflow.com/a/43687656/495455

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

这个异常告诉您有人已经向数据库添加了一个名为‘ AboutUs’的对象。

在这种情况下,由于数据库版本不受您的控制,因此 AutomaticMigrationsEnabled = true;可能会导致这种情况。为了避免不可预测的迁移,并确保团队中的每个开发人员都使用相同的数据库结构 我建议你设置 AutomaticMigrationsEnabled = false;

如果您非常小心,并且是项目中唯一的开发人员,那么自动迁移和编码迁移可以并存。

数据开发中心的《自动代码首次迁移》一文中有这样一句话:

自动迁移允许您使用代码优先迁移 在项目中有一个代码文件,用于每次更改 更改可以自动应用-例如列重命名 需要使用基于代码的迁移。

团队环境建议

您可以散布自动和基于代码的迁移,但这是 不推荐在团队开发方案中使用 使用源代码管理的开发人员团队 纯自动迁移或纯基于代码的迁移 我们推荐使用基于代码的自动迁移的局限性 团队环境中的迁移。

确保解决方案启动项目在配置文件中具有正确的 Connectionstring。或者在执行 update-database 命令时设置-StartUpProjectName 参数。StartUpProjectName 参数指定用于命名连接字符串的配置文件。如果省略,则使用指定项目的配置文件。

下面是 ef- 迁移命令引用的链接 Http://coding.abel.nu/2012/03/ef-migrations-command-reference/

删除 dbo _ MigationHistory 表中的行,或者删除该表并运行

update-database -verbose

它将逐个运行项目中的所有迁移

在我的例子中,我重新命名了包含代码优先实体框架模型的程序集。尽管在调用的所有迁移表中实际的模式都没有更改

dbo.__MigrationHistory

包含基于 老了程序集名称的已执行迁移的列表。我更新了迁移表中的旧名称以匹配新名称,然后迁移再次工作。

在迁移文件中检查 Public 覆盖 void Up ()方法。也许你正在尝试创建一个新的数据库对象已经在数据库中。 因此,您需要在创建 db 对象之前删除这个对象/表

DropTable("dbo.ABC");
CreateTable(
"dbo.ABC",
c => new
{
Id = c.Int(nullable: false, identity: true),
..
}

现在开始迁移 Update-Database -TargetMigration: "2016_YourMigration"

也许您已经更改了项目中的命名空间!
在数据库中有一个称为 dbo.__MigrationHistory的表,该表有一个称为 ContextKey的列。
此列的值基于您的 namespace。例如“ DataAccess.Migrations.Configuration”。
更改命名空间时,将导致具有不同命名空间的表名重复。
因此,在代码端更改名称空间之后,也要在数据库中更改该表中的名称空间(对于所有行)。
例如,如果将名称空间更改为 EFDataAccess,则应将 dbo.__MigrationHistory中的 ContextKey列的值更改为“ EFDataAccess.Migrations.Configuration”。
然后在代码端,在 Tools = > Package Manager Console 中,使用 update-database命令。

不更改数据库中的上下文值的另一种选择是将代码中的上下文值硬编码为旧的命名空间值。通过继承 DbMigrationsConfiguration<YourDbContext>和在构造函数中将旧的上下文值赋给 ContextKey,然后从 MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>继承并保留该类为空,就可以做到这一点。最后要做的是在静态构造函数中调用 DbContext 中的 Database.SetInitializer(new YourDbInitializer());

我希望你的问题能得到解决。

注意: 不推荐解决方案。但在某些情况下快速修复。

对于我来说,生产数据库中的 dbo._MigrationHistory在发布过程中遗漏了迁移记录,但是开发数据库中有所有的迁移记录。

如果与 dev db 相比,生产 db 具有相同和最新的模式,那么将所有迁移记录复制到生产 db 可以解决这个问题。

您可以单独使用 VisualStudio。

  1. 打开“ SQLServer 对象资源管理器”面板 > 右键单击源数据库中的 dbo._MigrationHistory表(在我的例子中是 dev db) > 单击“数据比较...”菜单。
  2. 然后,数据比较向导弹出,选择目标数据库(在我的示例中是 productiondb)并单击 Next。
  3. 几秒钟后,它将显示一些记录只在源数据库。只需点击“更新目标”按钮。
  4. 在浏览器中,点击刷新按钮,看到错误消息消失。

再次注意,在复杂和严肃的项目中不推荐使用这种方法。只有在 ASP.Net 或 EntityFramework 学习过程中遇到问题时才使用此选项。

在我的例子中,我的 EFMigrationsHistory表是空的(不知何故) ,当尝试运行 update-database时,我会得到:

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

在看到表被清空之后,它尝试重新运行初始迁移并尝试重新创建表是有意义的。

为了解决这个问题,我在 EFMigrationsHistory表中添加了行。我知道数据库已经更新了的每次迁移的1行。

一行有两列: MigrationIdProductVersion

MigrationId是迁移文件的名称

ProductVersion是您正在运行的 ef 版本。您可以通过在 PackageManager 控制台中键入 Get-Package并查找 ef 包来找到它。

希望这对某些人有帮助。

只需执行命令 update-mobile-Script。这会产生新的 * 。Sql 脚本,包括迁移中包含的所有 DB 更改。在代码的末尾是插入命令,如下所示: INSERT [ dbo ]。[ _ _ MigationHistory ]([ MigationId ] ,[ ContextKey ] ,[ Model ] ,[ ProductVersion ])您可以简单地运行它,所有的 INSERT 和 DB 都将被同步

在我的情况下,问题是在 Seeder。我打电话给 ctx。数据库。EnsureCreated ()内部,据我所知,update database 命令已经成功执行,但是 Seeder“第二次”尝试创建数据库。

如何处理:

  1. 执行螺母运行更新,只需启动应用程序并调用 EnsureCreated ()。数据库将被创建/更新
  2. 注释或删除播种机。

在一个多小时没有得到任何结果之后,我尝试了另一种方法,没有使用迁移,但是我做了一个模式比较。

在 VisualStudio 中-> Tools-> SQLServer-> 新架构比较

首先,我使用 EF 迁移创建了一个全新的数据库。然后我做了一个比较,将新的数据库与我想要更新的数据库进行比较。最后生成了一个迁移脚本,我可以执行模式更新。

另一个极端情况下的 EF Core 方案。

检查你有一个 移民/ yournamecontextmodelsnapshot.cs文件。

详情载于-https://learn.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration

如果您试图通过删除 mobilation.cs 文件手动重新创建数据库,那么请注意您的汇编/* contextmodelsnapshot.cs 文件是否仍然存在。

如果没有它,您的后续迁移就没有快照来创建所需的差异,新的迁移文件看起来就像是从头开始重新创建所有内容,然后您将得到现有的表错误,如上所示。

在我的例子中(想要重置并获得一个新的数据库) ,

首先,我得到了错误消息: There is already an object named 'TABLENAME' in the database.

我之前看到了:

"Applying migration '20111111111111_InitialCreate'.
Failed executing DbCommand (16ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE MYFIRSTTABLENAME"

我的数据库已经创建,但在迁移历史中没有记录。

我删除了 dbo 以外的所有表

迁徙历史是空白的。

dotnet ef database update -c StudyContext --verbose

(——冗长只是为了好玩)

得到了 Done.

我也有同样的问题,在三个小时的挣扎之后,我发现到底发生了什么

在我的例子中,当我第一次想要迁移时,在 up()方法中,默认代码想要创建已经存在的表,所以我得到了与您相同的错误

要解决这个问题,只要删除那些代码,然后写我想要的。例如,我想添加一个专栏,所以我只是写

migrationBuilder.AddColumn<string>(
name: "fieldName",
table: "tableName",
nullable: true);

我遇到了下面这个问题,然后我按照下面的方法修复了它:

  1. 检查项目中的当前数据库:
    • dotnet ef migrations list
  2. 如果最新的是你添加的,那么删除它:
    • dotnet ef migrations remove
  3. 此数据库的保证输出必须在源代码: . cs/. Designer.cs 文件中删除

4. 现在好了。试着重新加上: dotnet ef migrations add [new_dbo_name]

5. 最后,根据迁移列表的安排,再次尝试更新:

  • dotnet ef database update [First]
  • dotnet ef database update [Second]
  • ...
  • dotnet ef database update [new_dbo_name]

希望对你有所帮助。 ^ ^

我也是。 问题是,实际上我删除了我的数据库表 MoviesCast,并创建了新的表,问题是,我上次迁移是试图在数据库中引入已删除的表 MoviesCast。 我通过简单地删除上次迁移的所有内容并简单地运行 Up () & down ()方法解决了这个问题

public override void Up()
{
}


public override void Down()
{
}

然后更新数据库,并简单地添加新的迁移

您删除的迁移文件夹比您试图运行“更新数据库”命令在包管理器控制台? 如果是这样

手动删除所有表 然后运行,如果 update-database (将删除系统的种子数据)

Elnaz 在回答中也提到了同样的问题。在重构我们的项目期间,我需要更改数据层的名称空间。这导致迁移在数据库中看不到现有的迁移。我在詹姆斯 · 钱伯斯的博客中找到了这个问题的绝佳答案。

Http://jameschambers.com/2014/02/changing-the-namespace-with-entity-framework-6-0-code-first-databases/

我只是在迁移配置文件中更改了以下内容。

public Configuration()
{
AutomaticMigrationsEnabled = false;
this.ContextKey = “Old_Namespace.Migrations.Configuration”;
}

希望这能帮到其他陷入困境的人。

另一种方法是在 InitialClass 中的 Up 和 Down 方法之间注释所有内容。然后运行 update-database,运行种子方法成功后再运行 update-database,可能对一些朋友有帮助。

我也面临着同样的问题,我尝试了以下解决方案: 1. delete 从 Up ()创建表代码和从 Down ()方法创建相关代码 2. 在 Package Manager Consol 中运行 update-database 命令

这解决了我的问题

注意: 我这样做是因为我的数据库中没有任何东西。 就我而言: 1. 我在 包管理器控制台中通过命令 迁移-迁移删除了一个迁移 2. 通过“ SQLServer 对象资源管理器”面板 > 当前数据库 > 右键单击 > 删除数据库 3. 在 包管理器控制台中迁移,写入 添加-迁移,然后单击 Enter 4. 命令 < em > update-database 的最后一次更新

同样的情况(服务器上没有数据库和迁移历史表)。我的步骤:

  1. 我删除了第一次迁移中向上和向下部分的迁移数据。
  2. 使用空迁移更新数据库(创建了 MigationHistory 表)
  3. 添加您的 REAL 迁移并用它更新数据库。

在数据库中,query _ _ MigationHistory 表并复制[ ContextKey ]。

将其粘贴到 DbMigationsConextKey 中,如下所示

internal sealed class DbConfiguration: DbMigrationsConfiguration<DbContext>
{
public DbConfiguration()
{
AutomaticMigrationsEnabled = true;
ContextKey = "<contextKey from above>";
}

下面的步骤对我同样适用:

场景:

我试图在现有的电子邮件功能模型中添加2个新字段。新字段是“ IsEmailVerfied”和“ ActivationCode”

我所遵循的步骤:

1. 删除“迁移”文件夹下阻止我更新数据库的旧迁移文件 2. 恢复了我最近对模型所做的所有修改

3. 运行以下命令:

“ Data Source = DESKTOP SQLEXPRESS; InitialCatalog = Custom; Perist Security Info = True; User ID = sa; password = * * * < em > < strong >”

4. 从迁移文件中删除 Up ()和 Down ()方法的内容,并将方法保留为空

5. 运行以下命令:

“数据源 = DESKTOP SQLEXPRESS; 初始目录 = 自定义; 持久安全信息 = True; 用户 ID = sa; 密码 = ”* * *

  1. 执行上述步骤后,model 和 DB 看起来是同步的。

  2. 现在,我在模型中添加了新的属性

         public bool IsEmailVerified { get; set; }
    public Guid ActivationCode { get; set; }
    
  3. 运行以下命令:

“ Data Source = DESKTOP SQLEXPRESS; InitialCatalog = Custom; Perist Security Info = True; User ID = sa; password = ”* * *

  1. 现在迁移文件只包含我最近的更改如下:

       public override void Up()
    {
    AddColumn("dbo.UserAccounts", "IsEmailVerified", c => c.Boolean(nullable: false));
    AddColumn("dbo.UserAccounts", "ActivationCode", c => c.Guid(nullable: false));
    }
    public override void Down()
    {
    DropColumn("dbo.UserAccounts", "ActivationCode");
    DropColumn("dbo.UserAccounts", "IsEmailVerified");
    }
    
  2. 运行以下命令: “数据源 = DESKTOP SQLEXPRESS; 初始目录 = 自定义; 持久安全信息 = True; 用户 ID = sa; 密码 = ”* * *

11. 现在我成功地用额外的列更新了数据库。

下表是根据最近的变化更新的:

更新迁移后的表

面对类似的问题,我发现使用的连接来自一个发布配置文件,尽管我已经更改了 appsetings.json 中的连接。这导致迁移尝试创建一个已经存在的表。修改项目的连接服务中的连接为我解决了这个问题。

当你运行 update-database 命令的时候,它会检查 _ _ EFMigationsHistory 数据库中的表记录和你项目中的 EffImmigration 文件夹条目,所以如果你的项目文件夹中有一个迁移条目不存在于数据库中,那么开始在数据库中应用这些迁移条目,最终你可能会面临这样的错误。 因此,比较容易移动的文件夹项目与 _ _ EFMigationsHistory 表在数据库中,并确保他们都是同步和相同的,如果有任何项目不在数据库添加它的记录在数据库中,以保持同步两者在一起。(实际上它可能会导致这种情况,因为您可能会截断以 db 表示的 _ _ EFMigationHistory 表)

我的问题可能是一次性的/奇怪的情况,但是 FWIW 我也得到了这个错误,问题来自于我的 AppDbContext.cs 有一个 OnConfig ()方法,它指向一个不同的数据库(其中已经包含了对象)。使用-详细帮助我找到了这个。

我删除了 OnConfiguration 方法,但是后来我的 Update-Database 抛出了一个不同的错误。最后,我意识到我必须在 AppDbContext.cs 文件中保留 OnConfigure 方法,并包含实际的数据库连接字符串。这当然是多余的,我意识到用户/传递信息在你的代码像这样是旧的/不是很安全,但一旦我做了这些更改,我的更新数据库终于工作/没有错误。我的相关代码如下。如果有人对如何以更干净的方式解决这个问题提出建议,请一定要参与进来。

// my appdbcontext.css file
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("Server=myserver;Database=mydatabase;MultipleActiveResultSets=true;User ID=myuser;Password=mypass");
}
}
// my program.cs
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));