[.net] 데이터베이스 생성 이후 ‘ApplicationDbContext’컨텍스트를 지원하는 모델이 변경되었습니다.
우선, 다른 곳에서는이 오류를 본 적이 없으며 복제가 아닌 것 같으므로 먼저 전체 상황을 읽으십시오.
모든 것이 잘 작동 한 다음 아래에 나열 할 모델 클래스 ( 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__DisplayClassf
1.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(Action
at 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.InternalSet
1. Microsoft.AspNet.Identity의1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable
System.Data.Entity.QueryableExtensions.Include [T, TProperty] (IQueryable1 source, Expression
1 경로)에 있는 System.Data.Entity.Infrastructure.DbQuery 1 원본, 문자열 경로의 포함 (문자열 경로) . EntityFramework.UserStore6.GetUserAggregateAsync(Expression
1 필터) Microsoft.AspNet.Identity.EntityFramework.UserStore6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager
2. 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");
}
}
답변
다른 누군가가 저와 같은 데이터베이스 첫 번째 구현을 수행하는 것을 우연히 발견하는 경우를 대비하여.
ApplicationUser
클래스 를 확장 하고 AspNetUsers
테이블에 새 필드를 추가 하여 변경 한 다음 시작시이 오류가 발생했습니다.
__MigrationHistory
테이블 에서 생성 된 레코드를 삭제하여이 문제를 해결할 수있었습니다 (레코드가 하나뿐입니다). EF가 마이그레이션 도구를 사용하여 데이터베이스를 업데이트해야한다고 결정했다고 가정했지만 이미 수동으로 수행했습니다.
답변
이것은 나를 위해 일했습니다-다른 변경이 필요하지 않습니다.
DELETE FROM [dbo].[__MigrationHistory]
답변
이 게시물은 내 문제를 해결했습니다. 에 다음 줄을 추가하는 것이 전부 Application_Start()
입니다 Global.asax
.
Database.SetInitializer<Models.YourDbContext>(null);
그러나 모델의 모든 편집에 대해 데이터베이스가 다시 생성되어 데이터가 손실 될 수 있습니다.
답변
“데이터베이스> 시스템 테이블”에서 “[__MigrationHistory]”테이블을 삭제하면 작동합니다.
답변
정말 이상한 오류 였고, 마지막에는 내 오류가 아니었고, Microsoft의 오류였습니다. Entity 프레임 워크를 “시험판”버전으로 설치했고이 오류에 책임이있었습니다. 그것을 풀어 놓으십시오, 내가이 질문을 물었을 때 모두가 나를 믿어 주셔서 감사합니다. 해결 방법을 찾기 위해 1 주일 정도 검색 했으므로이 문제가 다른 곳이 아니라고 확신합니다. 도움이된다면 문제는 6.0.2였습니다.
답변
모두가이 오류로 골머리를 앓고 있습니다. 모든 프로젝트에 동일한 Entity Framework 어셈블리에 대한 참조가 있는지 확인하십시오.
짧은 이야기 :
내 모델과 응용 프로그램은 서로 다른 어셈블리에있었습니다. 이러한 어셈블리는 다른 버전의 Entity Framework를 참조했습니다. 두 버전이 동일한 모델에 대해 다른 ID를 생성했다고 생각합니다. 그래서 내 응용 프로그램이 실행되었을 때 모델의 ID가 __MigrationHistory의 최신 마이그레이션 중 하나와 일치하지 않았습니다. 최신 EF 릴리스에 대한 모든 참조를 업데이트 한 후 오류가 다시 나타나지 않았습니다.
답변
이 문제를 해결하기 위해 며칠을 보냈고 다양한 게시물을 분석하고 많은 옵션을 시도한 후 마침내 수정했습니다.
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
여기에서 언급 된 예외를 피하기 위해주의해야 할 모든 발언과 충족해야하는 모든 조건 / 요구 사항을 수집했습니다.
- 솔루션의 모든 프로젝트에 대해 하나의 EntityFramework Nuget 패키지 버전 만 사용해야합니다.
- 순차적으로 실행하여 생성 된 데이터베이스 모든 마이그레이션 스크립트는 대상 데이터베이스와 동일한 구조 / 스키마를 가져야하며 엔티티 모델에 해당해야합니다. 다음 3 가지 항목은 서로 정확히 일치 / 반영 / 일치해야합니다.
- 마지막까지 모든 마이그레이션 스크립트
- 현재 코드 첫 번째 엔터티 모델 상태 (DbContext, 엔터티)
- 대상 데이터베이스
- 대상 데이터베이스 (mdf 파일)는 마지막 마이그레이션 스크립트까지 업데이트 / 해당해야합니다. 대상 데이터베이스의 “__MigrationHistory”테이블에 보유한 모든 마이그레이션 스크립트에 대한 레코드가 포함되어 있는지 확인하십시오. 이는 모든 마이그레이션 스크립트가 해당 데이터베이스에 성공적으로 적용되었음을 의미합니다. 데이터베이스에 해당하는 올바른 코드 우선 엔터티 및 컨텍스트를 생성하려면 Visual Studio를 사용하는 것이 좋습니다. Project-> Add New Item-> ADO.NET Entity Data Model-> Code First from database :
물론 대안으로 수동으로 모델 (코드 우선 엔티티 및 컨텍스트 코딩)을 작성한 다음 초기 마이그레이션 및 데이터베이스를 생성 할 수있는 데이터베이스가 없습니다. -
연결 문자열 이름 (예 : 시작 프로젝트의 구성 파일 (Web.config / App.config)에있는 MyConnectionString ) :
<configuration> <connectionStrings> <add name="MyConnectionString" connectionString="..."> </connectionStrings> <configuration>
DbContext의 생성자에 전달 된 매개 변수와 같아야합니다.
public partial class MyDbContext : DbContext { public MyDbContext() : base("name=MyConnectionString"){} ...
- 패키지 관리자 콘솔을 사용하기 전에 업데이트 또는 마이그레이션 생성을 위해 올바른 데이터베이스를 사용하고 있고 필요한 프로젝트가 솔루션의 시작 프로젝트로 설정되어 있는지 확인하십시오 . 데이터베이스에 연결하려면 프로젝트에서 시작 프로젝트로 설정된 .config 파일의 연결 문자열을 사용합니다.
-
그리고 내 문제를 해결 한 주요 : 이상하지만 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>()); ...
나는 깨끗하고 다시 빌드 솔루션을 시도했지만 도움이되지 않았습니다. 위의 줄), 최신 마이그레이션에 해당하고 예외가 더 이상 나타나지 않았습니다.
따라서 이것은 문제를 해결할 수 있습니다.- 시작 프로젝트에서 수동으로 bin, obj 폴더 제거 (데이터베이스 생성 / 업데이트)
- 시작 프로젝트를 빌드하거나 모든 솔루션을 더 잘 정리하고 다시 빌드하십시오.
- 프로젝트를 시작하여 데이터베이스를 다시 만들거나 (위의 줄이 실행 됨) 패키지 관리자 콘솔 “update-database”명령을 사용합니다.
- 생성 된 db 및 __MirgationHistory가 최신 마이그레이션 스크립트에 해당하는지 수동으로 확인합니다.