programing

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

instargram 2023. 5. 7. 10:57
반응형

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

오류 메시지:

"'주소록' 컨텍스트를 지원하는 모델은 데이터베이스가 생성된 이후로 변경되었습니다.데이터베이스를 수동으로 삭제/업데이트하거나 데이터베이스를 호출합니다.ID 데이터베이스로 Initializer이니셜라이저 인스턴스입니다.예를 들어, Recreate DatabaseIfModelChanges 전략은 자동으로 데이터베이스를 삭제하고 다시 만들고 선택적으로 새 데이터로 시드합니다."

코드 우선 기능을 사용하려고 노력하고 있으며 다음과 같이 작성했습니다.

var modelBuilder = new ModelBuilder();
var model = modelBuilder.CreateModel();
using (AddressBook context = new AddressBook(model))
{
    var contact = new Contact
    {
        ContactID = 10000,
        FirstName = "Brian",
        LastName = "Lara",
        ModifiedDate = DateTime.Now,
        AddDate = DateTime.Now,
        Title = "Mr."

    };
    context.contacts.Add(contact);
    int result = context.SaveChanges();
    Console.WriteLine("Result :- "+ result.ToString());
}

컨텍스트 클래스:

public class AddressBook : DbContext
{
    public AddressBook()
    { }
    public AddressBook(DbModel AddressBook)
        : base(AddressBook)
    {

    }
    public DbSet<Contact> contacts { get; set; }
    public DbSet<Address> Addresses { get; set; }
}

연결 문자열:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
    <add name="AddressBook" providerName="System.Data.SqlClient"  
         connectionString="Data Source=MyMachine;Initial Catalog=AddressBook;
         Integrated Security=True;MultipleActiveResultSets=True;"/>
    </connectionStrings>
</configuration>

데이터베이스 이름은 "AddressBook"이며, 컨텍스트에 연락처 개체를 추가하려고 하면 오류가 발생합니다.제가 놓친 게 있나요?

이제 다음과 같습니다.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer<YourDbContext>(null);
    base.OnModelCreating(modelBuilder);
}

YourDbContext.cs 파일에 있습니다.

다음은 실제로 일어나고 있는 일에 대해 Jeff가 게시Scott Gu's Blog의 몇 가지 정보입니다.

이 예외가 발생하는 경우:

"데이터베이스가 생성된 이후 '운영' 컨텍스트를 지원하는 모델이 변경되었습니다.으로 삭제하거나 "" "/" "로 하십시오.Database.SetInitializerIDatabaseInitializer예를 들어."

다음은 현재 진행 중인 작업과 대처 방법입니다.

모델이 처음 생성될 때 데이터베이스를 실행합니다.데이터베이스가 없는 경우 데이터베이스를 만들거나 시드 데이터를 추가하는 등의 작업을 수행하는 이니셜라이저입니다.기본 데이터베이스Initializer는 모델을 사용하는 데 필요한 데이터베이스 스키마를 데이터베이스로 생성된 EdmMetadata 테이블에 저장된 스키마의 해시와 비교하려고 합니다(CodeFirst가 데이터베이스를 생성하는 경우).기존 데이터베이스에는 EdmMetadata 테이블이 없기 때문에 해시가 없습니다. 테이블이 없는 경우 현재 구현이 중단됩니다.정식 버전이 기본이기 때문에 발송하기 전에 이 동작을 변경하도록 하겠습니다.그 때까지 기존 데이터베이스는 일반적으로 데이터베이스 이니셜라이저가 필요하지 않으므로 다음을 호출하여 컨텍스트 유형에 대해 해제할 수 있습니다.

Database.SetInitializer<YourDbContext>(null);

제프

엔티티 프레임워크 5.0.0.0 - 6.1.3의 경우

다음 작업을 수행해야 합니다.

1. using System.Data.Entity;   to startup file (console app --> Program.cs / mvc --> global.asax
2. Database.SetInitializer<YourDatabaseContext>(null);

네, Matt Frear가 맞습니다.업데이트 - 편집: 주의할 점은 이 코드를 global.asax에 추가하는 대신 DbContext 클래스에 추가하는 다른 사람들과 동의한다는 것입니다.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // other code 
    Database.SetInitializer<YOURContext>(null);
    // more code here.
}

다른 사람들이 언급했듯이 이것은 유닛 테스트를 처리하는 데에도 좋습니다.

현재 Entity Framework 6.1.3 /.net 4.6.1과 함께 사용하고 있습니다.

조만간 CORE 스니펫을 제공하기 위해 다시 오겠습니다.

SQL Server Management Studio에서 다음 sql 명령을 실행하면 됩니다.

delete FROM [dbo].[__MigrationHistory]

이 수정은 CTP5 이후에는 더 이상 작동하지 않습니다.

은 해만합다를 합니다.Database.SetInitializer<YourContext>(null);

방금 답을 알아냈고 여기서 업데이트할 생각을 했습니다.다음을 수행하기만 하면 됩니다.

public class AddressBook: DbContext
{
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
    modelBuilder.IncludeMetadataInDatabase = false;
   }
}

또는 Global.asax.cs 파일의 Application_Start() 아래에 다음 행을 넣을 수 있습니다.

System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<ProjectName.Path.Context>());

프로젝트 이름을 변경해야 합니다.네임스페이스 및 컨텍스트의 경로.컨텍스트입니다.코드를 먼저 사용하면 스키마가 변경될 때마다 새 데이터베이스가 삭제되고 만들어집니다.

저는 이 문제를 해결하기 위해 많은 날들을 보냈고, 많은 다양한 게시물들을 분석했고, 많은 옵션들을 시도했고,EF 코드 첫 마이그레이션을 사용하여 내 솔루션에서 다음 2가지 프로젝트를 수행합니다.

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

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

내 환경:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional 업데이트 1
  • 제 모든 프로젝트들은..을 목표로 합니다.NET Framework 4.6.1
  • NuGet의 엔티티 프레임워크 6.1.3

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

  1. 솔루션의 모든 프로젝트에 대해 하나의 EntityFramework Nuget 패키지 버전만 사용해야 합니다.
  2. 모든 마이그레이션 스크립트를 순차적으로 실행하여 만든 데이터베이스는 대상 데이터베이스와 동일한 구조/구성표를 가지며 엔티티 모델에 해당해야 합니다.다음 세 가지 사항이 서로 정확하게 일치/반영/일치해야 합니다.
    • 마지막까지의 모든 마이그레이션 스크립트
    • 현재 코드 첫 번째 엔티티 모델 상태(DbContext, 엔티티)
    • 대상 데이터베이스
  3. 대상 데이터베이스(mdf 파일)를 최신 마이그레이션 스크립트로 업데이트해야 합니다."__Migration"을 확인합니다.대상 데이터베이스의 "내역" 표에는 사용자가 가지고 있는 모든 마이그레이션 스크립트에 대한 레코드가 들어 있습니다. 즉, 모든 마이그레이션 스크립트가 해당 데이터베이스에 성공적으로 적용되었음을 의미합니다.데이터베이스에 해당하는 올바른 코드 첫 번째 엔티티 및 컨텍스트 생성, Project -> Add New Item -> ADO에는 Visual Studio를 사용할 것을 권장합니다.NET 엔티티 데이터 모델 -> 데이터베이스에서 코드 우선: 물론 데이터베이스가 없는 경우 수동으로 모델을 작성한 다음(첫 번째 엔티티 및 컨텍스트 코드) 초기 마이그레이션 및 데이터베이스를 생성할 수 있습니다.
  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가 오래되어 마지막 빌드 이후 새로 고쳐지지 않았습니다.마이그레이션이 내 어셈블리 데이터 모델에 포함되었기 때문입니다.그런 다음 WebApi에서 이전 마이그레이션을 사용하여 데이터베이스를 업데이트했습니다.WebApi에서 데이터베이스를 업데이트한 후 DataModel의 최신 마이그레이션 스크립트와 일치하지 않는 이유가 무엇인지 혼란스러웠습니다.다음 코드는 자동으로 내 WebApi/App_Data 폴더에 최신 마이그레이션 로컬 데이터베이스를 만들거나 업데이트합니다.

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

    정리 및 재구축 솔루션을 시도했지만 도움이 되지 않았습니다. WebApi에서 bin 및 obj 폴더를 완전히 제거하고 WebApi/App_Data에서 데이터베이스 파일을 삭제하고, WebApi를 빌드하고, 다시 시작하고, 요청을 했고, 올바른 데이터베이스 - 게으른 초기화(위 라인 사용)를 만들었습니다. 이는 최신 마이그레이션에 해당하며 예외가 더 나타나지 않았습니다.그러면 문제가 해결될 수 있습니다.

    1. 시작 프로젝트에서 수동으로 bin, obj 폴더 제거(데이터베이스 생성/제거)
    2. 시작 프로젝트를 구축하거나 모든 솔루션을 보다 효과적으로 청소하고 재구축할 수 있습니다.
    3. 프로젝트를 시작하거나(위의 행을 실행함) Package Manager Console "update-database" 명령을 사용하여 데이터베이스를 다시 만듭니다.
    4. db 및 __Mirgation 생성 여부를 수동으로 확인합니다.기록은 최신 마이그레이션 스크립트에 해당합니다.

4.3.1로 업그레이드한 경우 EdmMetaData 테이블을 잘라내거나 완전히 삭제합니다.

VB.NET 개발자의 경우:

Application_Start() 메서드 끝에 있는 Glabal.asax.vb 파일에 다음 행을 추가합니다.

Database.SetInitializer(Of ApplicationDbContext)(Nothing)

ApplicationDbContext를 특정 DB 컨텍스트로 변경합니다.

저는 이 문제가 있었고 한 프로젝트는 SQL Express를 가리키고 있었지만 문제가 있는 프로젝트는 각각의 웹.config에 있는 LocalDb를 가리킨 것으로 나타났습니다.어리석은 실수이지만 다른 사람이 이 문제를 해결할 경우를 대비하여 여기서 주목할 가치가 있습니다.

실행되지 않은 컨텍스트에 일부 변경 사항이 있다는 의미입니다.마이그레이션 추가를 먼저 실행하여 수행한 변경 사항(인식할 수 없는 변경 사항)을 생성한 다음 데이터베이스 업데이트를 실행하십시오.

마이그레이션을 다시 추가하고 데이터베이스를 업데이트하는 것이 작동하지 않았고 위의 답변 중 어느 것도 옳은 것 같지 않은 문제가 있었습니다.여러 계층(웹 하나, 데이터 하나, 비즈니스 하나)을 사용하고 있다는 점에서 영감을 얻었습니다.데이터 계층에는 컨텍스트와 모든 모델이 있습니다.웹 계층은 이러한 예외를 제기한 적이 없습니다. 테스트 및 디버깅을 위해 콘솔 애플리케이션으로 설정한 비즈니스 계층입니다.비즈니스 계층이 DB를 가져오고 컨텍스트를 만드는 데 올바른 연결 문자열을 사용하지 않는 것으로 나타났습니다.그래서 저는 비즈니스 계층(및 데이터 계층)의 앱 구성에 연결 문자열을 추가했고 이를 위반했습니다.동일한 문제가 발생할 수 있는 다른 사용자를 위해 이 문서를 여기에 둡니다.

데이터베이스를 사용합니다.호환성With Model method(EF5에서 사용 가능): 사용하기 전에 모델과 DB가 일치하는지 테스트합니다.컨텍스트를 생성한 후 이 메서드를 호출합니다.

        // test the context to see if the model is out of sync with the db...
        if (!MyContext.Database.CompatibleWithModel(true))
        {
            // delete the old version of the database...
            if (File.Exists(databaseFileName))
                File.Delete(databaseFileName);
            MyContext.Database.Initialize(true);

            // re-populate database

        }

이 오류는 연결 문자열에 문제가 있고 연결 문자열 이름이 데이터베이스 컨텍스트 선언과 일치하는지 여부를 나타낼 수 있습니다.

로컬 데이터베이스의 이름을 잘못 지정했고(어리석은 실수) "DefaultConnection"의 web.config에 있는 연결 문자열의 이름이 MyDbContext와 일치하지 않았기 때문에 이 오류가 발생했습니다.

public MyDbContext(): base("DefaultConnection")
{}


<connectionStrings>
    <add name="DefaultConnection" ...
  </connectionStrings>

좋은 제안이지만, 모든 경우에 그렇게 정확하지는 않습니다.하나는 알아냈습니다.Visual Studio에서 PM 창을 사용하여 "마이그레이션 사용"을 실행해야 합니다. 그러면 마이그레이션 폴더가 프로젝트에 추가됩니다.

의 폴더에 추가된 두 개의 c# 클래스 파일에 모든 모델과 해당 속성이 포함되어 있는지 확인합니다.

솔루션을 구축하고 배포를 위해 게시할 수 있습니다.

응용 프로그램에 현재를 대체할 메타데이터가 없기 때문에 기존 메타데이터를 덮어쓸 수 없다는 논리입니다.결과적으로 "데이터베이스가 생성된 이후 컨텍스트를 지원하는 모델이 변경되었습니다."라는 오류가 발생합니다.

혹시 나랑 같은 시나리오를 가진 사람이 있을지도 몰라요.

데이터베이스를 먼저 EF로 지정하고 동시에 asp.net ID를 사용합니다.

그래서 저는 제 웹 구성에 두 개의 연결 문자열이 있고, 그것에는 문제가 없습니다.우연히 asp.net ID 테이블을 수동으로 생성하기 위해 스크립트를 생성/실행했습니다.

먼저 스크립트에서 수동으로 생성한 모든 asp.net ID 테이블을 삭제합니다.

DROP TABLE __MigrationHistory
DROP TABLE AspNetRoles
DROP TABLE AspNetUserClaims
DROP TABLE AspNetUserLogins
DROP TABLE AspNetUserRoles
DROP TABLE AspNetUsers

스키마 검사를 완전히 비활성화하는 것 외에는 이러한 솔루션 중 어떤 것도 작동하지 않습니다.결국 우리는 Newtonsoft.json 버전에서 일치하지 않았습니다.

AppConfig가 올바르게 업데이트되지 않았습니다.

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
  </dependentAssembly>

솔루션은 어셈블리 버전을 실제 배포 중인 버전으로 수정하는 것이었습니다.

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="10.0.0.0" />
  </dependentAssembly>

이 주제에 대해 조사한 결과, 기본적으로 로컬 sql server express에 이전에 생성된 db 인스턴스가 있는 경우 오류가 발생한다는 것을 발견했습니다.마다 DB에 업데이트를 하거나 DB에서 실행하지 .Update Database를 사용한 Package Manager Console우선, 당신은 우리의 로컬 sql express에서 이전 db를 수동으로 삭제해야 합니다.

또한, 이 솔루션은 다음과 같은 기능이 없는 한 작동합니다.AutomaticMigrationsEnabled = false;설정할 수 있습니다.

버전 제어 시스템(git, svn 등) 및 일부 다른 개발자가 프로덕션 단계에서 DB 개체를 업데이트하는 경우 코드 기반을 업데이트하고 응용 프로그램을 실행할 때마다 이 오류가 발생합니다.

위에서 언급한 것처럼 코드 기반에서 이에 대한 몇 가지 해결책이 있습니다.그러나 일부 경우에는 이 방법이 가장 실용적입니다.

저는 프로 ASP를 읽고 있습니다.NET MVC 4 책도 당신이 가지고 있던 것과 같은 문제에 부딪혔습니다.저는 책의 '모델 검증 추가' 섹션에서 규정한 변경을 한 후 문제가 발생하기 시작했습니다.이 문제를 해결하는 방법은 데이터베이스를 localdb에서 전체 SQL Server 2012 서버로 이동하는 것입니다. (BTW, 저는 전체 버전으로 전환할 수 있어서 행운이라는 것을 알고 있습니다. ;-))DB와의 통신에 문제가 있는 것이 분명합니다.

다음 단계를 확인합니다.

  1. 데이터베이스.Global.asax.cs 에서 Initializer(null); -->를 설정합니다.

2.

  1. 컨텍스트 클래스 이름이 확인과 일치해야 합니다.

Global.asax.cs을포하여함을 Application_Start이벤트 포함:

Database.SetInitializer<YourDatabaseContext>(
 new DropCreateDatabaseIfModelChanges<YourDatabaseContext>());

시스템 사용에 속하는 데이터베이스 SetInitializer를 사용해 보십시오.데이터. 엔티티;

전역.asax에서

protected void Application_Start()
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<yourContext>());
}

이렇게 하면 모델이 변경될 때마다 새 데이터베이스가 만들어집니다.하지만 데이터베이스가 비어 있습니다.더미 데이터로 채우기 위해 시드를 사용할 수 있습니다.다음과 같이 구현할 수 있습니다.

씨뿌리기 :

protected void Application_Start()
{
    Database.SetInitializer(new AddressBookInitializer());
                ----rest code---
}
public class AddressBookInitializer : DropCreateDatabaseIfModelChanges<AddressBook>
{
    protected override void Seed(AddressBook context)
    {
        context.yourmodel.Add(
        {

        });
        base.Seed(context);
    }

}

이상하지만, 여기 있는 모든 대답들은 저에게 쓸모가 없었습니다.나를 위해 작업된 이니셜라이저

최신 버전으로 데이터베이스 마이그레이션

제 솔루션은 다음과 같습니다(알고 있습니다. 훨씬 더 단순할 수 있지만 사용 방법이 그렇습니다).

class MyDbMigrateToLatest : MigrateDatabaseToLatestVersion<MyDbContext, Configuration>
{
}

public class MyDbContext: DbContext
{
    public MyDbContext() : base("DbName")
    {
        SetInitializer();
    }

    public MyDbContext(string connString) : base(connString)
    {
        SetInitializer();
    }

    private static void SetInitializer()
    {
        if (ConfigurationManager.AppSettings["RebuildDatabaseOnStart"] == "true")
            Database.SetInitializer(new MyDbInitializerForTesting());
        else
            Database.SetInitializer(new MyDbMigrateToLatest());
    }
}

public sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(MyDbContext context)
    {
        // Whatever
    }
}

MyDbInitializerForTesting은 DropCreateDatabase에서 상속만 합니다.특정한 경우(테스트)에는 항상 전체 데이터베이스가 재구성됩니다.그렇지 않으면 최신 버전으로 마이그레이션됩니다.

출처: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific

우리가 두 개의 애플리케이션에 하나의 데이터베이스를 사용했을 때도 같은 문제가 있었습니다.disableDatabaseInitialization="true"컨텍스트 유형 섹션이 저에게 적합합니다.

<entityFramework>
<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
<contexts>
  <context type="PreferencesContext, Preferences" disableDatabaseInitialization="true">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[PreferencesContext, Preferences], [Migrations.Configuration, Preferences]], EntityFramework" />
  </context>
</contexts>

자세한 내용은 https://msdn.microsoft.com/en-us/data/jj556606.aspx 를 참조하십시오.

사용자 지정 컨텍스트 초기화자 만들기:

public class MyDbContextInitializer : MigrateDatabaseToLatestVersion<MyDbContext, Migrations.Configuration>
{
    public override void InitializeDatabase(MyDbContext context)
    {
        bool exists = context.Database.Exists();

        base.InitializeDatabase(context);

        if (!exists)
        {         
            MyDbSeed.Seed(context);
        }
    }       
}

마이그레이션에 유의하십시오.구성은 패키지 관리자 콘솔의 마이그레이션 명령줄에서 생성하는 클래스입니다.마이그레이션의 내부 수식자를 공용 수식자로 변경해야 할 수 있습니다.구성 클래스.

그리고 OmM 모델에서 등록하기다음을 만듭니다.

public partial class MyDbContext : DbContext
{

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext>(new MyDbContextInitializer());

        //other code for creating model
    }
}

여기서 컨텍스트가 변경되었을 때 모델 백업 오류를 방지하는 다른 방법을 공유하고자 합니다.

DbContext 파일 열기

Microsoft를 사용하여 네임스페이스를 추가합니다.애스넷. 아이덴티티.엔티티 프레임워크

public MyDbContext() : base("name=MyDbContext") {데이터베이스입니다.Initializer 설정(새 DropCreate 데이터베이스 생성)항상(); }

언급URL : https://stackoverflow.com/questions/3600175/the-model-backing-the-database-context-has-changed-since-the-database-was-crea

반응형