패키지 관리자 콘솔에서 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; }
}
패키지 관리 콘솔 :
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>
답변
마이그레이션 프로세스에 문제가있는 것 같습니다. “패키지 관리자 콘솔”에서 add-migration 명령을 실행하십시오.
추가 마이그레이션 초기 -IgnoreChanges
일부 변경을 수행 한 다음 “초기”파일에서 데이터베이스를 업데이트합니다.
Update-Database -verbose
편집 :
-IgnoreChanges는 EF6에 있지만 EF Core에는 없습니다. 해결 방법은 다음과 같습니다.
https://stackoverflow.com/a/43687656/495455
답변
프로젝트에서 네임 스페이스를 변경했을 수 있습니다!
데이터베이스에라는 테이블이 있습니다 dbo.__MigrationHistory
. 테이블에는이라는 열이 ContextKey
있습니다.
이 열의 값은 namespace
. 예를 들어 ” DataAccess.Migrations.Configuration
“입니다.
네임 스페이스를 변경하면 네임 스페이스가 다른 테이블 이름이 중복됩니다.
따라서 코드 측에서 네임 스페이스를 변경 한 후 데이터베이스에서도이 테이블의 네임 스페이스를 변경하십시오 (모든 행에 대해).
예를 들어 네임 스페이스를로 EFDataAccess
변경하면의 ContextKey
열 값 dbo.__MigrationHistory
을 ” EFDataAccess.Migrations.Configuration
“로 변경해야합니다 .
그런 다음 코드 측 도구 => 패키지 관리자 콘솔에서 update-database
명령을 사용하십시오 .
데이터베이스에서 컨텍스트 값을 변경하는 대신 또 다른 옵션은 코드의 컨텍스트 값을 이전 네임 스페이스 값으로 하드 코딩하는 것입니다. 이것은 상속을 통해 가능 DbMigrationsConfiguration<YourDbContext>
하며 생성자에서 이전 컨텍스트 값을에 할당하고 해당 클래스를 ContextKey
상속 MigrateDatabaseToLatestVersion<YourDbContext, YourDbMigrationConfiguration>
하고 비워 두는 것보다 가능 합니다. 마지막으로 할 일은 Database.SetInitializer(new YourDbInitializer());
정적 생성자에서 DbContext를 호출 하는 것입니다.
문제가 해결되기를 바랍니다.
답변
“데이터베이스에 ‘AboutUs’라는 이름의 개체가 이미 있습니다.”
이 예외는 누군가가 이미 데이터베이스에 ‘AboutUs’라는 개체를 추가했음을 알려줍니다.
AutomaticMigrationsEnabled = true;
이 경우 데이터베이스 버전은 사용자가 제어하지 않기 때문에 발생할 수 있습니다. 예측할 수없는 마이그레이션을 방지하고 팀의 모든 개발자가 동일한 데이터베이스 구조와 작동하는지 확인하기 위해 당신이 설정 제안한다AutomaticMigrationsEnabled = false;
.
매우 신중하고 프로젝트에서 유일한 개발자 인 경우 자동 마이그레이션 및 코딩 된 마이그레이션이 함께 진행될 수 있습니다.
Data Developer Center의 Automatic Code First Migrations 게시물에서 인용 한 내용이 있습니다 .
자동 마이그레이션을 사용하면 변경할 때마다 프로젝트에 코드 파일이 없어도 Code First 마이그레이션을 사용할 수 있습니다. 모든 변경 사항이 자동으로 적용될 수있는 것은 아닙니다. 예를 들어 열 이름을 변경하려면 코드 기반 마이그레이션을 사용해야합니다.
팀 환경에 대한 권장 사항
자동 및 코드 기반 마이그레이션을 배치 할 수 있지만 팀 개발 시나리오에서는 권장되지 않습니다. 소스 제어를 사용하는 개발자 팀의 일원이라면 순수 자동 마이그레이션 또는 순수 코드 기반 마이그레이션을 사용해야합니다. 자동 마이그레이션의 한계를 고려할 때 팀 환경에서 코드 기반 마이그레이션을 사용하는 것이 좋습니다.
답변
제 경우에는 EFMigrationsHistory
테이블이 비워졌고 실행하려고 할 때 다음과 같은 결과가 나타납니다 update-database
.
데이터베이스에 이미 ‘AspNetUsers’라는 개체가 있습니다.
테이블이 비워진 것을 확인한 후 초기 마이그레이션을 다시 실행하고 테이블을 다시 만들려고하는 것이 합리적이었습니다.
이 문제를 해결하기 위해 EFMigrationsHistory
테이블 에 행을 추가했습니다 . 데이터베이스가 최신 상태라는 것을 알고있는 각 마이그레이션에 대해 1 행.
행 2 열을해야합니다 : MigrationId
및ProductVersion
MigrationId
마이그레이션 파일의 이름입니다. 예:20170628112345_Initial
ProductVersion
실행중인 ef 버전입니다. Get-Package
패키지 관리자 콘솔 에 입력 하고 ef 패키지를 찾으면 찾을 수 있습니다 .
이것이 누군가에게 도움이되기를 바랍니다.
답변
필자의 경우 코드 우선 엔터티 프레임 워크 모델이 포함 된 어셈블리의 이름을 변경했습니다. 실제 스키마는 호출 된 마이그레이션 테이블이 전혀 변경되지 않았지만
dbo.__MigrationHistory
에 기초하여 이미 수행 마이그레이션의 목록이 포함 된을 어셈블리 이름을 됩니다. 마이그레이션 테이블의 이전 이름을 새 이름과 일치하도록 업데이트 한 다음 마이그레이션이 다시 작동했습니다.
답변
솔루션 시작 프로젝트의 구성 파일에 올바른 연결 문자열이 있는지 확인하십시오. 또는 update-database 명령을 실행할 때 -StartUpProjectName 매개 변수를 설정하십시오. -StartUpProjectName 매개 변수는 명명 된 연결 문자열에 사용할 구성 파일을 지정합니다. 생략하면 지정된 프로젝트의 구성 파일이 사용됩니다.
다음은 ef-migration 명령 참조에 대한 링크입니다.
http://coding.abel.nu/2012/03/ef-migrations-command-reference/
답변
나는 똑같은 문제를 겪었고 3 시간의 어려움 끝에 무슨 일이 일어나고 있는지 알아 냈다.
제 경우에는 up()
메서드 에서 처음으로 마이그레이션하려고 할 때 기본 코드가 이미 존재하는 테이블을 만들고 싶어하므로 동일한 오류가 발생했습니다.
이를 해결하려면 해당 코드를 삭제하고 원하는대로 작성하십시오. 예를 들어 열을 추가하고 싶었 기 때문에
migrationBuilder.AddColumn<string>(
name: "fieldName",
table: "tableName",
nullable: true);