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

软件包pipe理器控制台中的Update-Database失败。 我已经使用了Entity Framework 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; } } 

包pipe理控制台:

 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> 

在迁移过程中似乎有问题,请在“软件包pipe理器控制台”中运行add-migration命令:

添加迁移初始-IgnoreChanges

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

更新数据库-verbose

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

另一种select而不是改变数据库中的上下文值是将代码中的上下文值硬编码为旧的名称空间值。 这可以通过inheritanceDbMigrationsConfiguration<YourDbContext>并在构造函数中指定旧的上下文值到ContextKey ,而不是从MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>inheritanceMigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>该类留空。 最后要做的就是调用Database.SetInitializer(new YourDbInitializer()); 在你的DbContext中的一个静态构造函数中。

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

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

这个exception告诉你有人已经把一个名为'AboutUs'的对象添加到数据库了。

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

如果你非常小心,项目中只有一个开发人员,自动迁移和编码迁移可以同时存在。

数据开发人员中心的“自动代码优先迁移”文章有一个引用 :

自动迁移使您可以使用代码优先迁移,而无需在项目中为每个更改生成代码文件。 并非所有更改都可以自动应用 – 例如列重命名需要使用基于代码的迁移。

对团队环境的build议

您可以散布自动和基于代码的迁移,但是这不build议在团队开发scheme中使用。 如果您是使用源代码pipe理的开发团队的一员,则应使用纯自动迁移或纯粹基于代码的迁移。 鉴于自动迁移的限制,我们build议在团队环境中使用基于代码的迁移。

确保你的解决scheme启动项目在configuration文件中有正确的connectionstring。 或者在执行update-database命令时设置-StartUpProjectName参数。 -StartUpProjectName参数指定用于命名连接string的configuration文件。 如果省略,则使用指定项目的configuration文件。

以下是ef-migration命令参考的链接http://coding.abel.nu/2012/03/ef-migrations-command-reference/

在我的情况下,我重新命名了包含代码优先entity framework模型的程序集。 虽然实际的模式在所有调用的迁移表中都没有改变

 dbo.__MigrationHistory 

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

注意:不build议解决scheme。 但在某些情况下可以快速修复。

对于我dbo._MigrationHistory ,生产数据库中的dbo._MigrationHistory在发布过程中错过了迁移logging,而开发数据库却有所有的迁移logging。

如果您确定生产数据库与开发数据库具有相同和最新的模式,将所有迁移logging复制到生产数据库可以解决问题。

您只能在VisualStudio中完成。

  1. 打开“SQL Server对象资源pipe理器”面板>右键单击源(在我的情况下,开发数据库) dbo._MigrationHistory表数据库>单击“数据比较…”菜单。
  2. 然后,数据比较向导强化,select目标数据库(在我的情况下生产数据库),然后单击下一步。
  3. 几秒钟后,它只会在源数据库中显示一些logging。 只需点击“更新目标”button。
  4. 在浏览器中,点击刷新button,看到错误信息消失。

需要注意的是,在复杂和严重的项目中,不推荐这样做。 使用这个只有你在ASP.Net或EntityFramework学习期间有问题。

在我的情况下,我的EFMigrationsHistory表被清空(以某种方式),当试图运行update-database我会得到:

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

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

为了解决这个问题,我把行添加到我的EFMigrationsHistory表中。 我知道数据库是最新的每个迁移1行。

一行将有2列: MigrationIdProductVersion

MigrationId是您的迁移文件的名称。 例如: 20170628112345_Initial

ProductVersion是您正在运行的ef版本。 您可以通过在软件包pipe理器控制台中inputGet-Package并查找您的ef软件包来find它。

希望这对某人有帮助。

从dbo_MigrationHistory表中删除行或删除表并运行

 update-database -verbose 

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

在迁移文件中检查公共覆盖无效的Up()方法。 也许你正在试图创build一个新的数据库对象。 所以,你需要在创builddb对象之前先删除这个对象/表。 就像波纹pipe一样,

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

现在运行你的迁移Update-Database -TargetMigration: "2016_YourMigration"