데이터베이스 생성 이후 'ApplicationDbContext'컨텍스트를 지원하는 모델이 변경되었습니다.


85

우선, 다른 곳에서는이 오류를 본 적이 없으며 복제가 아닌 것 같으므로 먼저 전체 상황을 읽으십시오.

모든 것이 잘 작동 한 다음 아래에 나열 할 모델 클래스 ( App 클래스 와 업데이트는 주석 처리됨) 중 하나업데이트 하려고했습니다 . 그리고 붐 나는이 추악한 오류가 있었다.


'ApplicationDbContext'컨텍스트를 지원하는 모델이 데이터베이스 생성 이후 변경되었습니다. Code First 마이그레이션을 사용하여 데이터베이스를 업데이트하십시오 ( http://go.microsoft.com/fwlink/?LinkId=238269 ). System.Data.Entity.CreateDatabaseIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf1.b__e () at System.Data.Entity.Internal.InternalContext.PerformInitializationAction (Action action) at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization () at System.Data.Entity. System.Data.Entity.Internal.RetryAction에서 Internal.LazyInternalContext.b__4 (InternalContext c) 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Actionat System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase () at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType (Type System.Data.Entity.Internal.Linq.InternalSet의 entityType)1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet1. Microsoft.AspNet.Identity의 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryableSystem.Data.Entity.QueryableExtensions.Include [T, TProperty] (IQueryable 1 source, Expression1 경로)에 있는 System.Data.Entity.Infrastructure.DbQuery 1 원본, 문자열 경로의 포함 (문자열 경로) . EntityFramework.UserStore 6.GetUserAggregateAsync(Expression1 필터) Microsoft.AspNet.Identity.EntityFramework.UserStore 6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager2. FindByNameAsync (String userName) at Microsoft.AspNet.Identity.UserManager`2.d__12.MoveNext () --- 이전 위치의 스택 추적 끝 예외가 발생했습니다 --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task) at ControlPanel.Web.Controllers.AccountController.d__2.MoveNext () in d : \ Projects \ FULL \ Control Panel \ ControlPanel.Web \ Controllers \ AccountController.cs : line 56

처음 에는 마이그레이션 문제라고 생각했기 때문에 데이터베이스를 완전히 삭제하고 마이그레이션을 다시 활성화하고 Init 마이그레이션을 추가하고 다음을 사용하여 데이터베이스를 업데이트했습니다.

update-database -force -verbose

모든 것이 불만없이 잘 진행되지만 내 사이트에 로그인하려고 할 때마다 이전 오류가 발생합니다. 문제를 해결할 수없는 상태에서 마이그레이션 작업을 10 번 정도했습니다.

다음은 내 도메인 클래스 (모델)입니다.

public class App
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int AppId { get; set; }
    //[Required]
    public virtual string FacebookId { get; set; }
    //[Required]
    public virtual string Secret { get; set; }      
    public virtual List<User> Users { get; set; }
    public virtual List<Post> Posts { get; set; }      
    //public virtual ApplicationUser Admin { get; set; }
}

public class Post
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int PostId { get; set; }
    public virtual string Content { get; set; }
    public virtual string Link { get; set; }
    public virtual string Image { get; set; }
    public virtual bool IsSpecial { get; set; }
    //[Required]
    public virtual App App { get; set; }
    //[Required]
    public virtual DateTime? PublishDate { get; set; }
}

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int UserId { get; set; }

    [MaxLength(500)]
    public virtual string FacebookId { get; set; }

    [MaxLength(500)]
    public virtual string Token { get; set; }

    //[Required]
    public virtual App App { get; set; }
}

내 IdentityModels는 다음과 같습니다.

public class ApplicationUser : IdentityUser
{
    public virtual List<App> Apps { get; set; }
    public bool? IsPremium { get; set; }
    [DataType(DataType.Date)]
    public DateTime? LastPublishDateTime { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("dCon")
    {
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUser>().ToTable("Admins");
        modelBuilder.Entity<ApplicationUser>().ToTable("Admins");
        modelBuilder.Entity<IdentityUserRole>().ToTable("AdminRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("Logins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("Claims");
        modelBuilder.Entity<IdentityRole>().ToTable("Roles");
    }
}

이 문제를 다른 곳에서 본 적이 없습니까? 이 링크는 어떻습니까? stackoverflow.com/questions/3600175/…
AndreCruz

4
아니요, 보장 할 수있는 것과 동일하지 않습니다. 결과가 전혀없는 솔루션을 시도해 보았습니다. 오류는 다음과 같습니다. 데이터베이스 업데이트
a7madx7

답변:


139

다른 누군가가 저와 같은 데이터베이스 첫 번째 구현을 수행하는 것을 우연히 발견하는 경우를 대비하여.

ApplicationUser클래스 를 확장 하고 AspNetUsers테이블에 새 필드를 추가 하여 변경 한 다음 시작시이 오류가 발생했습니다.

__MigrationHistory테이블 에서 생성 된 레코드를 삭제하여이 문제를 해결할 수있었습니다 (레코드가 하나뿐입니다). EF가 마이그레이션 도구를 사용하여 데이터베이스를 업데이트해야한다고 결정했다고 가정했지만 이미 수동으로 수행했습니다.


1
데이터베이스도 먼저 수정했습니다. 유일한 기록은 코드가 먼저 발생하는 초기 생성 이었지만 데이터베이스를 먼저 사용하고 MS SQL 서버에서 테이블을 변경 한 후 수정했습니다.
SolidSnake4444

일했다. 스캐 폴드보기를 추가 할 때 오류가 발생했습니다. 뷰의 데이터 컨텍스트 클래스는 했다ApplicationDbContext
빈센트 Saelzler

78

이것은 나를 위해 일했습니다-다른 변경이 필요하지 않습니다.

DELETE FROM [dbo].[__MigrationHistory]

1
나를 위해 일했습니다. 아주 이상한 수정. 역사상 깨진 이주가 있었다고 생각합니다. 모든 마이그레이션을 삭제하고 초기 마이그레이션을 다시 만들겠습니다.
hakan

1
@ 데이브 Voyles 당신은 SSMS에서 직접 SQL을 실행할 수 있습니다
다니엘 드 ZWAAN

1
저를 위해 일했습니다. 한 데이터베이스에서이 테이블이 존재하는 반면 다른 데이터베이스에는 dint가 존재합니다
Tejas

1
마지막 모델 업데이트까지 내 코드가 정상적으로 실행되었으므로 위의 답변은 나를 도울 수 없습니다. 당신의 대답이 트릭을했습니다. 건배!
Sithu

3
이것은 나를 위해 작동하지 않았으며 db를 삭제하고 마이그레이션을 다시 실행하고 데이터를 다시 추가해야했습니다. 조심하세요.
adamonstack

35

게시물은 내 문제를 해결했습니다. 에 다음 줄을 추가하는 것이 전부 Application_Start()입니다 Global.asax.

Database.SetInitializer<Models.YourDbContext>(null);

그러나 모델의 모든 편집에 대해 데이터베이스가 다시 생성되어 데이터가 손실 될 수 있습니다.


4
데이터가 손상되거나 손실되는 것을 원하지 않습니다.
사이드 Roohullah Allem

최선의 방법은 아닙니다. 솔루션 그러나 신뢰할 수 없습니다
아산 아프 탑

13

"데이터베이스> 시스템 테이블"에서 "[__MigrationHistory]"테이블을 삭제하면 작동합니다.


효과가있다. 그러나 [__MigrationHistory] 테이블을 삭제 한 후 EDMX mmodel도 업데이트하십시오.
DmitryBoyko

12

정말 이상한 오류 였고, 마지막에는 내 오류가 아니었고, Microsoft의 오류였습니다. Entity 프레임 워크를 "시험판"버전으로 설치했고이 오류에 책임이있었습니다. 그것을 풀어 놓으십시오, 내가이 질문을 물었을 때 모두가 나를 믿어 주셔서 감사합니다. 해결 방법을 찾기 위해 1 주일 정도 검색 했으므로이 문제가 다른 곳이 아니라고 확신합니다. 도움이된다면 문제는 6.0.2였습니다.


12

모두가이 오류로 골머리를 앓고 있습니다. 모든 프로젝트에 동일한 Entity Framework 어셈블리에 대한 참조가 있는지 확인하십시오.

짧은 이야기 :

내 모델과 응용 프로그램은 서로 다른 어셈블리에있었습니다. 이러한 어셈블리는 다른 버전의 Entity Framework를 참조했습니다. 두 버전이 동일한 모델에 대해 다른 ID를 생성했다고 생각합니다. 그래서 내 응용 프로그램이 실행되었을 때 모델의 ID가 __MigrationHistory의 최신 마이그레이션 중 하나와 일치하지 않았습니다. 최신 EF 릴리스에 대한 모든 참조를 업데이트 한 후 오류가 다시 나타나지 않았습니다.


네, 제 경우였습니다. 대부분의 프로젝트는 ef6.1.3이었고 새로 생성 된 테스트 프로젝트는 ef6.0이었습니다.
ZZZ

7

이 문제를 해결하기 위해 며칠을 보냈고 다양한 게시물을 분석하고 많은 옵션을 시도한 후 마침내 수정했습니다. EF 코드 우선 마이그레이션을 사용하는 내 솔루션의이 두 프로젝트 :

  • 내 코드 우선 엔티티, DbContext, Mirgations 및 일반 저장소를 모두 포함하는 어셈블리로 주로 사용하는 콘솔 애플리케이션 "DataModel". 패키지 관리자 콘솔에서 마이그레이션을 생성 할 수 있도록이 프로젝트에 별도의 빈 로컬 데이터베이스 파일 (DataModel / App_Data 폴더에 있음)을 포함했습니다.
  • DataModel 프로젝트를 참조하고 프로젝트에 포함되지 않은 WebApi / App_Data 폴더의 로컬 데이터베이스 파일을 사용하는 WebApi

WebApi를 요청할 때이 오류가 발생했습니다.

내 환경 :

  • Windows 8.1 x64
  • Visual Studio 2015 Professional (업데이트 1 포함)
  • .NET Framework 4.6.1을 대상으로하는 모든 프로젝트
  • NuGet의 EntityFramework 6.1.3

여기에서 언급 된 예외를 피하기 위해주의해야 할 모든 발언과 충족해야하는 모든 조건 / 요구 사항을 수집했습니다.

  1. 솔루션의 모든 프로젝트에 대해 하나의 EntityFramework Nuget 패키지 버전 만 사용해야합니다.
  2. 순차적으로 실행하여 생성 된 데이터베이스 모든 마이그레이션 스크립트는 대상 데이터베이스와 동일한 구조 / 스키마를 가져야하며 엔티티 모델에 해당해야합니다. 다음 3 가지 항목은 서로 정확히 일치 / 반영 / 일치해야합니다.
    • 마지막까지 모든 마이그레이션 스크립트
    • 현재 코드 첫 번째 엔터티 모델 상태 (DbContext, 엔터티)
    • 대상 데이터베이스
  3. 대상 데이터베이스 (mdf 파일)는 마지막 마이그레이션 스크립트까지 업데이트 / 해당해야합니다. 대상 데이터베이스의 "__MigrationHistory"테이블에 보유한 모든 마이그레이션 스크립트에 대한 레코드가 포함되어 있는지 확인하십시오. 이는 모든 마이그레이션 스크립트가 해당 데이터베이스에 성공적으로 적용되었음을 의미합니다. 데이터베이스에 해당하는 올바른 코드 우선 엔터티 및 컨텍스트를 생성하려면 Visual Studio를 사용하는 것이 좋습니다. Project-> Add New Item-> ADO.NET Entity Data Model-> Code First from database : 물론 대안으로 수동으로 모델 (코드 우선 엔티티 및 컨텍스트 코딩)을 작성한 다음 초기 마이그레이션 및 데이터베이스를 생성 할 수있는 데이터베이스가 없습니다.
  4. 연결 문자열 이름 (예 : 시작 프로젝트의 구성 파일 (Web.config / App.config)에있는 MyConnectionString ) :

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

    DbContext의 생성자에 전달 된 매개 변수와 같아야합니다.

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
    
  5. 패키지 관리자 콘솔을 사용하기 전에 업데이트 또는 마이그레이션 생성을 위해 올바른 데이터베이스를 사용하고 있고 필요한 프로젝트가 솔루션의 시작 프로젝트로 설정되어 있는지 확인하십시오 . 데이터베이스에 연결하려면 프로젝트에서 시작 프로젝트로 설정된 .config 파일의 연결 문자열을 사용합니다.
  6. 그리고 내 문제를 해결 한 주요 : 이상하지만 WebApi / bin 폴더에서 DataModel.exe는 오래되어 마지막 빌드 이후 새로 고쳐지지 않았습니다. 마이그레이션이 내 어셈블리 DataModel.exe에 포함 되었기 때문에 WebApi는 이전 미러링을 사용하여 데이터베이스를 업데이트했습니다. WebApi에서 데이터베이스를 업데이트 한 후 DataModel의 최신 마이그레이션 스크립트와 일치하지 않는 이유를 혼동했습니다. 다음 코드는 내 WebApi / App_Data 폴더에 최신 마이그레이션 로컬 데이터베이스를 자동으로 생성 (존재하지 않는 경우)하거나 업데이트합니다.

       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...
    

    나는 깨끗하고 다시 빌드 솔루션을 시도했지만 도움이되지 않았습니다. 위의 줄), 최신 마이그레이션에 해당하고 예외가 더 이상 나타나지 않았습니다. 따라서 이것은 문제를 해결할 수 있습니다.

    1. 시작 프로젝트에서 수동으로 bin, obj 폴더 제거 (데이터베이스 생성 / 업데이트)
    2. 시작 프로젝트를 빌드하거나 모든 솔루션을 더 잘 정리하고 다시 빌드하십시오.
    3. 프로젝트를 시작하여 데이터베이스를 다시 만들거나 (위의 줄이 실행 됨) 패키지 관리자 콘솔 "update-database"명령을 사용합니다.
    4. 생성 된 db 및 __MirgationHistory가 최신 마이그레이션 스크립트에 해당하는지 수동으로 확인합니다.

3

이것은 모델 속성의 데이터 주석을 변경할 때 발생할 수 있습니다. 예 : 속성에 [필수] 를 추가 하면 데이터베이스 디자인에 보류중인 변경이 발생합니다.

가장 안전한 솔루션은 패키지 관리자 콘솔에서 실행하는 것입니다.

add-migration myMirgrationName

Up () 메서드의 정확한 변경 사항을 표시합니다. 따라서 다음을 통해 이러한 변경 사항을 실제로 적용할지 여부를 결정할 수 있습니다.

update-database

그렇지 않으면 __MigrationHistory 테이블과 솔루션 탐색기의 마이그레이션 폴더에서 최신 마이그레이션을 삭제할 수 있습니다.


이것은 내가 여기서 본 최고의 대답입니다. 마이그레이션 기록을 삭제하라는 제안은 제 생각에는 매우 나쁜 생각입니다!
mgrenier

귀하의 의견에 감사드립니다. 나는 또한 일반적으로 마이그레이션 기록을 삭제하는 것을 권장하지 않지만 특히 이전 마이그레이션 지점이 너무 다르지 않았습니다. , 마지막 마이그레이션 레코드 만 삭제합니다.
Mohamed Nagieb

2

a7madx7과 동일한 문제가 있었지만 EF (v6.1.1)의 안정적인 릴리스로 다음 위치에 해결 방법이 게시되었습니다.

http://cybarlab.com/context-has-changed-since-the-database-was-created

변형 : http://patrickdesjardins.com/blog/the-model-backing-the-context-has-changed-since-the-database-was-created-ef4-3

두번째 링크는 ..... VB에 대한 구체적인 언급을 포함한다 "단순히 같은 Global.asax 파일에 app_start 방법에서이 문제가있는 모든 databasecontext을 추가 할 수 있습니다" :

Database.SetInitializer(Of DatabaseContext)(Nothing)

NB : "DatabaseContext"를 DbContext를 구현하는 클래스 이름으로 바꿔야했습니다.

업데이트 : 또한 codefirst 접근 방식을 사용하여 기존 테이블에 연결할 때 데이터베이스를 확인하여 EF가 매핑을 저장하기 위해 테이블 ​​"_migrationhistory"를 만들 었는지 확인합니다. 이 테이블의 이름을 변경 한 다음 global.asax에서 SetInitializer를 제거 할 수있었습니다.


2

데이터베이스의 _MigrationHistory에서 마이그레이션 기록을 삭제하십시오. 그것은 나를 위해 일했습니다


1

웹 사이트 폴더의 모든 파일을 삭제 한 다음 다시 게시하여 비슷한 문제를 해결했습니다.


1

모든 테이블 ID 제거

Delete _MigrationHistory
Delete AspNetRoles
Delete AspNetUserClaims
Delete AspNetUserLogins
Delete AspNetRoles
Delete AspNetUser

1

도구 메뉴에서 NuGet 패키지 관리자를 클릭 한 다음 패키지 관리자 콘솔 (PMC)을 클릭합니다. PMC에 다음 명령을 입력하십시오.

Enable-Migrations Add-Migration Init Update-Database 응용 프로그램을 실행합니다. 문제에 대한 해결책은 여기에서


1

개발할 때이 실용적인 클래스를 사용하여 마이그레이션을 구성하는 것을 선호합니다.

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

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
        this.Configuration.LazyLoadingEnabled = false;
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

        Database.SetInitializer(new StackOverflowInitializer());
    }

    public class StackOverflowInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
    {
        public StackOverflowInitializer()
        {
            // TODO NOTHING, COMMENT ALL

            // IF CHANGES, RECREATE
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ApplicationDbContext>());

            // CREATE ONLY NOT EXITS
            //Database.SetInitializer<Context>(new CreateDatabaseIfNotExists<ApplicationDbContext>());
        }

    }

    public System.Data.Entity.DbSet<stackoverflow.Models.Company> Companies { get; set; }

}

0

이전 productVersion을 사용하여 [__MigrationHistory] 테이블에서 행을 삭제하는 것이 저에게 효과적이었습니다. 이 대답은 전체 [__MigrationHistory] 테이블을 삭제하고 싶지 않은 사람들을위한 것입니다. ProductVersion 열에서 이전 버전의 행을 삭제하면됩니다. 도움이되기를 바랍니다!


0

아래는 내가 만난 비슷한 종류의 오류였습니다.

'PsnlContext'컨텍스트를 지원하는 모델이 데이터베이스가 생성 된 이후 변경되었습니다. Code First 마이그레이션을 사용하여 데이터베이스를 업데이트하십시오 ( http://go.microsoft.com/fwlink/?LinkId=238269 ).

오류를 해결하기 위해 Global.asax의 Application Start 이벤트에 아래 섹션을 추가했습니다.

Database.SetInitializer (null);

문제가 해결되었습니다.


0

단순히 오류는 모델에 변경 사항이 있고 DB와 동기화되지 않았 음을 의미하므로 패키지 관리자 콘솔로 이동 add-migration foo2 하면 문제의 원인에 대한 힌트를 얻을 수 있습니다. 무언가를 제거했거나 제 경우에는 데이터 주석을 제거했습니다. . 거기에서 변경 사항을 얻고 모델에서 되돌릴 수 있습니다.

그 후 foo2를 삭제하십시오.


0

나는 내가 매우 늦었다는 것을 알고 있지만 나도 기부하고 싶다. 이 오류는 클래스와 속성이 변경되었지만 데이터베이스에 커밋되지 않았기 때문에 브라우저가 변경 사항을 렌더링하는 방법을 이해할 수 없기 때문에 정말 이상합니다.

그러니 한 가지만하십시오.

다음 명령을 사용하여 패키지 관리자 콘솔 (도구> NuGet 패키지 관리자> 패키지 관리자 콘솔) 에서 마이그레이션 하나를 만듭니다 .

추가 마이그레이션 UpdateMigration

여기서 UpdateMigration은 마이그레이션의 이름입니다. 원하는 이름을 지정할 수 있지만 구체적으로 지정하십시오.

그 후에 데이터베이스를 업데이트하면되므로 다음을 실행하십시오.

데이터베이스 갱신

이제 데이터베이스에 변경 사항을 커밋 했으므로 브라우저를 새로 고치면됩니다.

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


0

이는 모델 중 하나에 일부 속성을 추가했지만 그렇지 않았기 때문 update-Database입니다. 이 문제를 해결하려면 모델에서 제거하거나 add-migration anyProperName 해당 속성 및 Update-database.


0

이 오류는 모델을 변경하고 데이터베이스를 업데이트하기 위해 변경 사항을 마이그레이션하지 않았을 때 발생했습니다.

Code First Migration Schema에서 모델을 변경 한 적이있는 경우

마이그레이션을 추가하는 것을 잊지 마십시오

add-migration UpdatesToModelProperites 

위의 명령은 모델에서 변경 한 모든 내용을 읽고 Up () 및 Down () 메서드에 기록합니다.

그런 다음 아래 명령을 사용하여 데이터베이스를 업데이트하십시오.

update-database

이것은 나를 위해 일한 것입니다.


-2

기존 db 삭제, 동일한 이름으로 새 db 생성, 모든 데이터 복사 ... 작동합니다.

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