데이터베이스에 이미 이름이 지정된 개체가 있습니다.


115

패키지 관리자 콘솔에서 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> 

어떻게 할 수 있습니까 (기존 디자인에 매핑)?
Roohullah Allem은

15
@HLGEM, "잘 설계된 데이터베이스"가 EF를 사용하여 개체 모델에 매핑 될 수 있다면 EF도 생성 할 수 있습니다. DB 마이그레이션은 데이터베이스를보다 쉽게 ​​배포 할 수있는 강력한 도구입니다. DB 마이그레이션을 사용하지 않는 것이 좋습니다. 그렇지 않으면 어쨌든 패치 스크립트가 필요합니다. DB 마이그레이션을 바로 사용하는 것이 좋습니다.
Ilya Palkin 2014 년

답변:


129

마이그레이션 프로세스에 문제가있는 것 같습니다. "패키지 관리자 콘솔"에서 add-migration 명령을 실행하십시오.

추가 마이그레이션 초기 -IgnoreChanges

일부 변경을 수행 한 다음 "초기"파일에서 데이터베이스를 업데이트합니다.

Update-Database -verbose

편집 : -IgnoreChanges는 EF6에 있지만 EF Core에는 없습니다. 해결 방법은 다음과 같습니다. https://stackoverflow.com/a/43687656/495455


8
이것이 정확히 무엇을합니까? 그러면 새 모델이 이전 모델을 덮어 쓸 수 있습니까?
Travis Tubbs 2016

1
데이터베이스에서 뷰와 테이블을 사용하기 때문에 수동 마이그레이션을 사용하기 시작했습니다. 자동 마이그레이션을 사용하려는 실수를 저질렀 고 결과적으로 뷰에서 테이블을 만들려고했습니다. 이 시나리오에서는 솔루션이 작동하지 않으므로 대신 항상 수동 마이그레이션을 사용해야합니다. 따라서이 작업을 수행 한 후 소스 제어의 변경 사항을 취소하고 _Migrations 테이블에서 "초기"항목을 제거해야했습니다.
arame3333

3
이로 인해 무한 루프가 발생합니다. 패키지 관리자 콘솔은 "다음 명시 적 마이그레이션이 보류 중이기 때문에 명시 적 마이그레이션을 생성 할 수 없습니다 ..."라는 오류 (InitialCreate)를 제공하므로 추가 마이그레이션을 수행 할 수 없습니다. 그러나 초기 -IgnoreChanges도있을 때까지 Update-Database를 성공적으로 실행할 수없는 경우 어떻게해야합니까 ??
East of Nowhere

6
Add-Migration : 매개 변수 이름 'IgnoreChanges'와 일치하는 매개 변수를 찾을 수 없습니다.
Tzvi Gregory Kaidanov

3
@TravisTubbs는 마이그레이션 테이블과 관련하여 모델이 db와 동기화된다는 변경 사항과 "가짜"를 무시합니다. 여전히 두 가지를 수동으로 동기화해야합니다. 제 경우에는 모델에 대한 변경 사항을 제거하고, 추가 마이그레이션을 수행하고, 업데이트 데이터베이스를 수행하기 전에 업 / 다운 메서드에서 콘텐츠를 제거했습니다. 이로 인해 마이그레이션이 중단되기 전의 상태로 돌아 왔습니다. 그리고 사실, 변경 사항을 다시 추가 평소와 같이 추가 마이그레이션 및 업데이트 데이터베이스를했다 - 동기화이 시간 모든
데이비드 Refaeli를

73

프로젝트에서 네임 스페이스를 변경했을 수 있습니다!
데이터베이스에라는 테이블이 있습니다 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를 호출 하는 것입니다.

문제가 해결되기를 바랍니다.


9
훌륭합니다. 정확히이 문제가있었습니다!
Olivier ROMAND

3
실제로 이것이이 오류의 실제 원인입니다. EF 그것은 네임 스페이스 차이 becuse 데이터베이스에 적용되는 어떤 마이그레이션 읽을 수있는 데이터베이스를 만들려고한다
UfukSURMEN

이 답변에 감사드립니다 .Olivier ROMAND가 말했듯이 정확하게이 문제가 발생했습니다!
Enrique A. Pinelo Novelo

나는 그것이 이것과 관련이 있다는 것을 몰랐지만 어떻게 든 MigrationHistory테이블 의 레코드를 제거해도 나를 위해 수정되지 않았습니다 ... 그래서 나는 모든 테이블을 삭제하고 EF가 모든 것을 다시 만들도록했습니다. 작은 앱, 큰 것은 아닙니다. ..하지만 그것은 나를 위해 그것을 고쳤습니다.
Niklas 2017

이것은 세부 사항이 포함 된 정답이며 때로는 폴더 이름을 잘못 입력하면이 문제가 발생할 수 있습니다.
H35am 2018

17

"데이터베이스에 'AboutUs'라는 이름의 개체가 이미 있습니다."

이 예외는 누군가가 이미 데이터베이스에 'AboutUs'라는 개체를 추가했음을 알려줍니다.

AutomaticMigrationsEnabled = true;이 경우 데이터베이스 버전은 사용자가 제어하지 않기 때문에 발생할 수 있습니다. 예측할 수없는 마이그레이션을 방지하고 팀의 모든 개발자가 동일한 데이터베이스 구조와 작동하는지 확인하기 위해 당신이 설정 제안한다AutomaticMigrationsEnabled = false; .

매우 신중하고 프로젝트에서 유일한 개발자 인 경우 자동 마이그레이션 및 코딩 된 마이그레이션이 함께 진행될 수 있습니다.

Data Developer Center의 Automatic Code First Migrations 게시물에서 인용 한 내용이 있습니다 .

자동 마이그레이션을 사용하면 변경할 때마다 프로젝트에 코드 파일이 없어도 Code First 마이그레이션을 사용할 수 있습니다. 모든 변경 사항이 자동으로 적용될 수있는 것은 아닙니다. 예를 들어 열 이름을 변경하려면 코드 기반 마이그레이션을 사용해야합니다.

팀 환경에 대한 권장 사항

자동 및 코드 기반 마이그레이션을 배치 할 수 있지만 팀 개발 시나리오에서는 권장되지 않습니다. 소스 제어를 사용하는 개발자 팀의 일원이라면 순수 자동 마이그레이션 또는 순수 코드 기반 마이그레이션을 사용해야합니다. 자동 마이그레이션의 한계를 고려할 때 팀 환경에서 코드 기반 마이그레이션을 사용하는 것이 좋습니다.


12

제 경우에는 EFMigrationsHistory테이블이 비워졌고 실행하려고 할 때 다음과 같은 결과가 나타납니다 update-database.

데이터베이스에 이미 'AspNetUsers'라는 개체가 있습니다.

테이블이 비워진 것을 확인한 후 초기 마이그레이션을 다시 실행하고 테이블을 다시 만들려고하는 것이 합리적이었습니다.

이 문제를 해결하기 위해 EFMigrationsHistory테이블 에 행을 추가했습니다 . 데이터베이스가 최신 상태라는 것을 알고있는 각 마이그레이션에 대해 1 행.

행 2 열을해야합니다 : MigrationIdProductVersion

MigrationId마이그레이션 파일의 이름입니다. 예:20170628112345_Initial

ProductVersion실행중인 ef 버전입니다. Get-Package패키지 관리자 콘솔 에 입력 하고 ef 패키지를 찾으면 찾을 수 있습니다 .

이것이 누군가에게 도움이되기를 바랍니다.


1
모델 열을 어떻게 채웠습니까?
시아 란 갤러거

7

필자의 경우 코드 우선 엔터티 프레임 워크 모델이 포함 된 어셈블리의 이름을 변경했습니다. 실제 스키마는 호출 된 마이그레이션 테이블이 전혀 변경되지 않았지만

dbo.__MigrationHistory

에 기초하여 이미 수행 마이그레이션의 목록이 포함 된을 어셈블리 이름을 됩니다. 마이그레이션 테이블의 이전 이름을 새 이름과 일치하도록 업데이트 한 다음 마이그레이션이 다시 작동했습니다.


5

솔루션 시작 프로젝트의 구성 파일에 올바른 연결 문자열이 있는지 확인하십시오. 또는 update-database 명령을 실행할 때 -StartUpProjectName 매개 변수를 설정하십시오. -StartUpProjectName 매개 변수는 명명 된 연결 문자열에 사용할 구성 파일을 지정합니다. 생략하면 지정된 프로젝트의 구성 파일이 사용됩니다.

다음은 ef-migration 명령 참조에 대한 링크입니다. http://coding.abel.nu/2012/03/ef-migrations-command-reference/


이 대답은 나를 실수로 이끌었고 단순히 Startup 프로젝트로 잘못된 프로젝트를 가졌습니다.
Martin Johansson

비슷한 문제가 있었는데 이로 인해 해결되었습니다.
JordanTDN

3

나는 똑같은 문제를 겪었고 3 시간의 어려움 끝에 무슨 일이 일어나고 있는지 알아 냈다.

제 경우에는 up()메서드 에서 처음으로 마이그레이션하려고 할 때 기본 코드가 이미 존재하는 테이블을 만들고 싶어하므로 동일한 오류가 발생했습니다.

이를 해결하려면 해당 코드를 삭제하고 원하는대로 작성하십시오. 예를 들어 열을 추가하고 싶었 기 때문에

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

좋은 대답처럼 보이지만 철자를 확인하는 것이 좋습니다. 코드 조각을 사용하여 마지막 줄이 코드임을 명확히 할 수도 있습니다. 도움이 필요하면 메시지를 보내주세요.
Mike Poole

덕분에 내가 어떻게 당신을 마사지 할 수 있습니다
아르파

1
코드 스 니펫 @arfa를 추가했습니다. 마사지 필요 없음 :). 나에게 메시지를 보내 @려면 댓글 섹션에 내 사용자 이름을 입력 하십시오.
Mike Poole

3

참고 : 권장되지 않는 솔루션입니다. 그러나 어떤 경우에는 빠른 수정.

나를 위해 dbo._MigrationHistory 프로덕션 데이터베이스에서 게시 프로세스 중에 마이그레이션 레코드가 누락되었지만 개발 데이터베이스에는 모든 마이그레이션 레코드가있었습니다.

프로덕션 db에 dev db와 비교하여 동일한 최신 스키마가 있다고 확신하는 경우 모든 마이그레이션 레코드를 프로덕션 db에 복사하면 문제를 해결할 수 있습니다.

VisualStudio로만 할 수 있습니다.

  1. 'SQL Server 개체 탐색기'패널 열기> dbo._MigrationHistory소스 (내 경우 dev db) 데이터베이스의 테이블을 마우스 오른쪽 버튼으로 클릭 > "데이터 비교 ..."메뉴를 클릭합니다.
  2. 그런 다음 데이터 비교 마법사가 나타나면 대상 데이터베이스 (제 경우에는 프로덕션 db)를 선택하고 다음을 클릭합니다.
  3. 몇 초 후 소스 데이터베이스에만 일부 레코드가 표시됩니다. '대상 업데이트'버튼을 클릭하면됩니다.
  4. 브라우저에서 새로 고침 버튼을 누르면 오류 메시지가 사라집니다.

다시 말하지만 복잡하고 진지한 프로젝트에서는 권장되지 않습니다. ASP.Net 또는 EntityFramework 학습 중에 문제가있는 경우에만 이것을 사용하십시오.


1
이것은 나를 위해 일했습니다. 하지만 그 반대였습니다. 내 프로덕션 db에는 __EFMigrationHistory의 모든 레코드가 있었지만 dev db에는 (초기 제외) 누락 된 레코드가 있습니다.
Jens Mander

1

dbo_MigrationHistory 테이블에서 행을 삭제하거나 테이블을 삭제하고 실행

update-database -verbose

프로젝트의 모든 마이그레이션을 하나씩 실행합니다.


1

제 경우에는 Seeder에 문제가있었습니다. 내부에서 _ctx.Database.EnsureCreated ()를 호출했고 내가 이해하는 한 데이터베이스 업데이트 명령이 성공적으로 실행되었지만 시더가 데이터베이스를 "두 번째"생성하려고했습니다.

해결 방법 :

  1. 업데이트를 실행하고 응용 프로그램을 시작하고 ensureCreated ()를 호출하십시오. 데이터베이스가 생성 / 업데이트됩니다.
  2. 시더를 주석 처리하거나 제거하십시오.

1

또 다른 엣지 케이스 EF Core 시나리오.

Migrations / YOURNAMEContextModelSnapshot.cs 파일 이 있는지 확인하십시오 .

자세한 내용은 https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#create-a-migration

migration.cs 파일을 삭제하여 데이터베이스를 수동으로 다시 만들려고 시도한 경우 Migrations / * ContextModelSnapshot.cs 파일이 여전히 존재하는지주의하십시오.

이것이 없으면 후속 마이그레이션에는 필요한 차이점을 생성 할 스냅 샷이 없으며 새 마이그레이션 파일이 처음부터 모든 것을 다시 생성하는 것처럼 보이면 위와 같이 기존 테이블 오류가 발생합니다.


1

나도 똑같은 일이 일어났다 .. 문제는 사실 내가 데이터베이스 테이블을 삭제 MoviesCast하고 새 테이블을 만들었고 문제는 마지막 마이그레이션이 MoviesCast데이터베이스에서 삭제 된 테이블을 유도하려한다는 것이었다 . 마지막 마이그레이션의 모든 내용을 간단히 제거하고 간단히 Up () & down () 메서드를 실행하여 문제를 해결했습니다.

public override void Up()
{
}

public override void Down()
{
}

그런 다음 데이터베이스를 업데이트하고 새 마이그레이션을 추가하기 만하면됩니다.


1

나는 Elnaz가 준 대답에서 설명한 것과 동일한 문제가 있습니다. 프로젝트를 리팩토링하는 동안 데이터 레이어의 네임 스페이스를 변경해야했습니다. 이로 인해 마이그레이션시 데이터베이스의 기존 마이그레이션이 표시되지 않습니다. James Chambers가 블로그에 올린이 문제에 대한 훌륭한 답변을 찾았습니다.

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”;
}

이것이 다른 사람을 도와주기를 바랍니다.


네임 스페이스가 변경된 후에도 비슷한 상황이 발생했습니다. 이 수정을 시도했지만 여전히 작동하지 않았습니다. 그래서 데이터베이스 테이블에서 네임 스페이스를 수동으로 수정 한 다음 작동하기 시작했습니다.
kosist

0

update-migration -Script 명령을 실행하기 만하면됩니다. 마이그레이션에 포함 된 모든 DB 변경 사항을 포함하는 새로운 * .sql 스크립트가 생성됩니다. 코드의 끝에는 다음과 같은 삽입 명령이 있습니다. INSERT [dbo]. [__ MigrationHistory] ([MigrationId], [ContextKey], [Model], [ProductVersion])이 모든 INSERT 및 DB가 동기화됩니다.


0

한 시간 이상 결과를 얻지 못한 후 마이그레이션을 사용하지 않고 다른 접근 방식을 시도했지만 스키마 비교를 수행했습니다.

Visual Studio-> 도구-> SQL Server-> 새 스키마 비교

먼저 EF 마이그레이션으로 완전히 새로운 데이터베이스를 만들었습니다. 내가 업데이트하려는 데이터베이스와 새 데이터베이스를 비교하여 비교 한 것보다. 마지막으로 마이그레이션 스크립트를 생성하고 스키마 업데이트를 수행 할 수 있습니다.


0

제 경우에는 (재설정하고 새로운 데이터베이스를 얻고 싶습니다),

먼저 오류 메시지가 나타납니다. 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 .__ MigrationsHistory를 제외한 모든 테이블을 삭제합니다.

MigrationsHistory가 비어 있습니다.

운영 dotnet ef database update -c StudyContext --verbose

(-재미를위한 상세 정보)

그리고 얻었다 Done.


0

나는 아래와 같은 버그에 직면했다. 그런 다음 아래와 같이 수정했습니다.

  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]

도움이 되었기를 바랍니다. ^^


0

패키지 관리자 콘솔에서 "update-database"명령을 실행하려는 것보다 마이그레이션 폴더를 삭제 했습니까? 그렇다면

수동으로 모든 테이블을 삭제하십시오. update-databse (단점 데이터가 삭제됨) 인 경우 실행하십시오.


0

또 다른 방법은 초기 클래스의 모든 것을 Up과 Down Methods 사이에 주석으로 처리하는 것입니다. 그런 다음 seed 메소드를 실행 한 후 update-database를 실행하여 update-database를 다시 실행하십시오.


0

나는 같은 문제에 직면했다. 아래 솔루션을 시도했습니다. 1. Up ()에서 테이블 코드 생성 및 Down () 메서드에서 관련 코드 삭제 2. 패키지 관리자 콘솔에서 update-database 명령 실행

이것은 내 문제를 해결했다


0

참고 : 데이터베이스에 아무것도 없기 때문에 그렇게했습니다. 제 경우 : 1. 패키지 관리자 콘솔 에서 remove-migration 명령으로 마이그레이션을 제거했습니다 . 2. 'SQL Server 개체 탐색기'패널에서 데이터베이스 제거> 현재 데이터베이스에서> 마우스 오른쪽 버튼 클릭> 제거 3. 패키지 관리자 콘솔 에서 마이그레이션 쓰기 추가 -Migration 및 Enter를 클릭합니다. 4. 명령에 의한 마지막 업데이트 update-database


0

동일한 경우 (서버에 DB 및 MigrationHistory 테이블 없음). 내 단계 :

  1. 첫 마이그레이션의 업 / 다운 섹션에서 마이그레이션 데이터를 삭제했습니다.
  2. 빈 마이그레이션으로 데이터베이스 업데이트 (MigrationHistory 테이블이 생성됨)
  3. REAL 마이그레이션을 추가하고 데이터베이스를 업데이트하십시오.

0

데이터베이스에서 __MigrationHistory 테이블을 쿼리하고 [ContextKey]를 복사합니다.

아래와 같이 DbMigrationsConfiguration ConextKey에 붙여 넣습니다.

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

0

아래 단계는 동일한 문제에 대해 저에게 효과적이었습니다.

대본:

이메일 기능을 위해 기존 모델에 2 개의 새 필드를 추가하려고했습니다. 새 필드는 "IsEmailVerified"및 "ActivationCode"입니다.

내가 따라온 단계 :

1. "Migrations"폴더 아래에있는 이전 마이그레이션 파일을 삭제하여 Update-Database를 수행 할 수 없습니다. 2. 모델에서 수행 한 모든 최근 변경 사항을 되돌 렸습니다.

3. 아래 명령을 실행합니다.

마이그레이션 추가 -ConnectionProviderName System.Data.SqlClient -ConnectionString "데이터 원본 = DESKTOP \ SQLEXPRESS; 초기 카탈로그 = 사용자 지정; 보안 유지 정보 = True; 사용자 ID = sa; 암호 = **** "

4. 마이그레이션 파일에서 Up () 및 Down () 메서드의 내용을 삭제하고 메서드를 비워 둡니다.

5. 아래 명령을 실행합니다.

Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = "***

  1. 위의 단계를 수행하면 모델과 DB가 동기화 된 것처럼 보입니다.

  2. 이제 모델에 새 속성을 추가했습니다.

         public bool IsEmailVerified { get; set; }
         public Guid ActivationCode { get; set; }
  3. 아래 명령을 실행하십시오.

마이그레이션 추가 -ConnectionProviderName System.Data.SqlClient -ConnectionString "데이터 원본 = DESKTOP \ SQLEXPRESS; 초기 카탈로그 = 사용자 지정; 지속 보안 정보 = True; 사용자 ID = sa; 암호 = "***

  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. 아래 명령을 실행합니다. Update-Database -ConnectionProviderName System.Data.SqlClient -ConnectionString "Data Source = DESKTOP \ SQLEXPRESS; Initial Catalog = Custom; Persist Security Info = True; User ID = sa; password = "***

11. 이제 추가 열로 데이터베이스를 성공적으로 업데이트했습니다.

아래는 최근 변경 후 업데이트 된 표입니다.

업데이트 마이그레이션 후 표


정말로 이것을 권장하지 않습니다. 마이그레이션에서 제품을 삭제하면 환경이 파괴됩니다. 지금까지 작업 한 경우 마이그레이션을 삭제해야하는 이유는 무엇입니까? 여기에있는 모든 사용자에게 연결 문자열이 작동하지 않습니다. 그런 식으로 실행하면
안됩니다.

-5

마이그레이션 파일에서 공용 재정의 void Up () 메서드를 확인하십시오. 이미 데이터베이스에있는 새 db 개체를 만들려고 할 수 있습니다. 따라서 db 개체를 생성하기 전에이 개체 / 테이블을 삭제해야합니다. 그냥 벨로우즈처럼-

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

이제 마이그레이션을 실행하십시오. Update-Database -TargetMigration: "2016_YourMigration"


6
이렇게하면 모든 데이터를 잃게됩니다
Mehdiway
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.