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


253

오류 메시지 :

" '주소록'컨텍스트를 뒷받침하는 모델은 데이터베이스가 작성된 후 변경되었습니다. 데이터베이스를 수동으로 삭제 / 업데이트하거나 IDatabaseInitializer 인스턴스를 사용하여 Database.SetInitializer를 호출하십시오. 예를 들어 RecreateDatabaseIfModelChanges 전략은 데이터베이스를 자동으로 삭제하고 다시 작성합니다. 선택적으로 새로운 데이터로 시딩합니다. "

코드 우선 기능을 사용하려고하는데 다음과 같이 작성했습니다.

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"이며 연락처 개체를 컨텍스트에 추가하려고하면 오류가 발생합니다. 여기에 빠진 것이 있습니까?



데이터베이스에서 __MigrationHistory 테이블을 제거하십시오
Zahid Hasan

답변:


397

이제는 :

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

YourDbContext.cs 파일에


나는 수동으로 생산 DB를 변경하고 마이그레이션 끌하며, 감사를 작동 한
모흐센 아프신

13
추신, 이것은 Global.asax에 간다. Application_Start ()
BritishDeveloper

48
Global.asax보다 DbContext 클래스의 생성자에 넣는 것이 좋습니다. 이렇게하면 Global.asax 파일로 제어되는 사이트가 아니라 컨텍스트를 사용하는 모든 사이트에서 작동합니다.
Corin

7
컨텍스트 클래스의 정적 생성자에 배치하는 것이 가장 좋습니다 (예 : 비디오 : msdn.microsoft.com/en-us/data/jj572367
Christian Fredh

3
보호 된 재정의 안에 배치해야합니다. void OnModelCreating (DbModelBuilder modelBuilder) {Database.SetInitializer <YourDbContext> (null); base.OnModelCreating (modelBuilder); }
Chris Voon

135

다음 은 Jeff가 게시 한 Scott Gu 블로그 의 실제 정보입니다.

이 예외가 발생하는 경우 :

"데이터베이스가 생성 된 이후 '생산'컨텍스트를 백업 모델이 변경되었습니다. 수동 / 삭제 데이터베이스, 또는 전화 업데이트 Database.SetInitializerIDatabaseInitializer인스턴스를."

다음은 진행중인 작업과 수행 할 작업입니다.

모델이 처음 생성되면 DatabaseInitializer를 실행하여 데이터베이스가 없거나 시드 데이터를 추가하는 경우 데이터베이스 생성과 같은 작업을 수행합니다. 기본 DatabaseInitializer는 모델을 사용하는 데 필요한 데이터베이스 스키마와 데이터베이스로 작성된 EdmMetadata 테이블에 저장된 스키마의 해시 (코드 우선이 데이터베이스를 작성하는 경우)를 비교하려고합니다. 기존 데이터베이스에는 EdmMetadata 테이블이 없으므로 해시가 없습니다. 해당 테이블이 누락되면 오늘 구현에서 예외가 발생합니다. 우리는이 버전이 기본 버전이기 때문에이 버전을 변경하기 위해 노력할 것입니다. 그때까지 기존 데이터베이스에는 일반적으로 데이터베이스 초기화 프로그램이 필요하지 않으므로 다음을 호출하여 컨텍스트 유형에 대해 해제 할 수 있습니다.

Database.SetInitializer<YourDbContext>(null);

제프


9
오늘 이것을 시도했지만 더 이상 "모델이 변경되었습니다"라는 메시지가 표시되지 않고 대신 "잘못된 개체 이름 'dbo.Table'"이 표시됩니다.
Stefan Bergfeldt

3
Jeff는이 문제를 해결하기를 원했지만 2 년이 넘었으며 SetInitializer를 null로 설정해야합니다. 권리? 따라서 누군가 이것이 마이그레이션 워크 플로에 어떻게 적용되는지 설명해 주시겠습니까?
kroiz

2
@jakejgordon : EF6도 나와 있지만 Global.asax에 있으면 웹 사이트를 실행할 때만 문제가 해결됩니다. 단위 테스트가 있다면 OOL입니다. YourDbContext의 생성자에 넣는 것이 좋습니다. 웹 사이트 및 테스트 프로젝트를 포함한 모든 프로젝트에서 수정됩니다.

1
IMO,이 답변은 우리 가이 코드 줄을 추가 해야하는지 실제로 설명하기 때문에 더 높은 점수를 받아야합니다 . 감사합니다.
Paul

1
@StefanBergfeldt 만약 당신이나 누군가가 Invalid object name 'dbo.Table연결 문자열을 확인 하면 attachDbFilename 및 초기 카탈로그
benscabbia

41

들어 6.1.3 - 엔티티 프레임 워크 5.0.0.0

당신은 DO 실제로 다음을 수행 할 :

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

예, 매트 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 스 니펫을 제공하기 위해 다시 방문 할 것입니다.


1
감사합니다! Program.cs는 콘솔에서 작동합니다.
HockeyJ

그러나 처음 데이터베이스를 초기화 할 때 onModelCreating 메소드에 setinitializer null을 넣으면 데이터베이스가 생성되지 않습니다. 이견있는 사람 ? 이벤트 사용 (var context = Activator.CreateInstance <TContext> ()) {context.Database.Initialize (true); }
Rupesh Kumar Tiwari

나는 때때로 라인을 주석 처리하고 스왑하는 데 사용할 코드를 찾아야합니다 ... 문제를 기억하지 못합니다.
Tom Stickel

1
최고의 솔루션. 솔루션이 실행되고 파급 효과가 무엇인지 알 수 없습니다. 커밋하고 배포하십시오.
Svend

32

SQL Server Management Studio에서 followng sql 명령을 실행하십시오.

delete FROM [dbo].[__MigrationHistory]

1
당신은 내 생명을 구했습니다! 감사합니다.
Marek Dorda

31

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

너가해야되는 Database.SetInitializer<YourContext>(null);


1
어디 그 이동은하지 ... OnModelCreating는 DbDatabase라는 접근 아무것도 없다
제임스 Reategui

시작할 때 Application_Start에서 설정했습니다.
chrisortman

Database.SetInitializer는 EF 4.3 최종 릴리스에서 제대로 작동하는 것 같습니다.
Richard Beier

"CTP5 이후에는 더 이상이 수정 프로그램이 작동하지 않습니다"라는 말은 2010 년 8 월 30 일의 수락 된 답변이 그가 말한 것입니다.
Tom Stickel

19

여기에 대한 답변과 업데이트를 생각했습니다. 다음을 수행하면됩니다.

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

12
이후 버전의 EF에서는 더 이상 가능 modelBuilder.Conventions.Remove<IncludeMetadataConvention>();하지 않으며 상황에 도움이되지 않습니다. DbDatabase.SetInitialzer (null); 작동합니다.
JTew

@TomStickel-동의합니다. stackoverflow.com/a/6143116/255562 를 답변 으로 표시했습니다 .
Ashish Gupta

16

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

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

ProjectName.Path.Context를 네임 스페이스 및 컨텍스트로 변경하십시오. 코드를 먼저 사용하면 스키마가 변경 될 때마다 새 데이터베이스가 삭제되고 작성됩니다.


프로토 타이핑 만했기 때문에 정확히 필요한 것입니다. 고마워
학습자

8

나는이 문제를 해결하기 위해 며칠을 보냈고 많은 다른 게시물을 분석하고 많은 옵션을 시도하고 마침내 수정했습니다. 이 2는 EF 코드 첫 번째 마이그레이션을 사용하여 솔루션에 프로젝트합니다.

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

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

내 환경 :

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

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

  1. 솔루션의 모든 프로젝트에는 하나의 EntityFramework Nuget 패키지 버전 만 사용해야합니다.
  2. 순차적으로 모든 마이그레이션 스크립트를 실행하여 작성된 데이터베이스는 데이터베이스를 대상으로하고 엔티티 모델에 해당하는 구조 / 스키마와 동일해야합니다. 다음 3 가지가 서로 정확히 일치 / 반사 / 일치해야합니다.
    • 마지막으로 모든 마이그레이션 스크립트
    • 현재 코드 첫 번째 엔티티 모델 상태 (DbContext, 엔티티)
    • 대상 데이터베이스
  3. 대상 데이터베이스 (mdf 파일)는 마지막 마이그레이션 스크립트까지 업데이트 / 해당되어야합니다. 대상 데이터베이스의 "__MigrationHistory"테이블에 모든 마이그레이션 스크립트에 대한 레코드가 포함되어 있는지 확인하십시오. 이는 모든 마이그레이션 스크립트가 해당 데이터베이스에 성공적으로 적용되었음을 의미합니다. 데이터베이스-프로젝트-> 새 항목 추가-> ADO.NET 엔터티 데이터 모델-> 데이터베이스에서 첫 번째 코드에 해당하는 올바른 코드 첫 번째 엔터티 및 컨텍스트를 생성하기 위해 Visual Studio를 사용하는 것이 좋습니다. 물론, 대안으로 수동 모델을 작성 (첫 번째 엔티티 및 컨텍스트 코딩) 한 다음 초기 마이그레이션 및 데이터베이스를 생성 할 수있는 데이터베이스가 없습니다.
  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>()); 
               ...

    깨끗하고 재구성 솔루션을 시도했지만 WebApi에서 bin 및 obj 폴더를 완전히 제거하고, WebApi / App_Data에서 데이터베이스 파일을 삭제하고, WebApi를 다시 시작하고, 요청한 후, 올바른 데이터베이스를 만들었습니다. 최신 마이그레이션에 해당하며 예외는 더 이상 나타나지 않았습니다. 따라서 문제가 해결 될 수 있습니다.

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

5

나를 위해 4.3.1로 업그레이드하면 EdmMetaData 테이블을 자르거나 완전히 삭제합니다.


4.3.1로 업데이트 한 다음 EdmMaetaData 테이블의 이름을 변경했습니다. 이제 필요에 따라 모델을 변경할 수 있으며 모델 백업 blah blah에 대한 더 이상 성가신 오류 메시지가 없습니다.
Ashok Padmanabhan 2016 년

3

VB.NET 개발자의 경우 :

Application_Start () 메소드의 끝에 Glabal.asax.vb 파일에 다음 행을 추가하십시오.

Database.SetInitializer(Of ApplicationDbContext)(Nothing)

ApplicationDbContext를 특정 Db 컨텍스트로 변경하십시오.


2

나는이 문제가 있었고 한 프로젝트는 SQLExpress를 가리키고 있지만 문제가있는 프로젝트는 LocalDb를 가리키고 있음이 밝혀졌습니다. (각 web.config에 있음). 바보 같은 감독이지만 다른 사람 이이 문제를 해결하는 경우 여기에 주목할 가치가 있습니다.


2

실행되지 않은 컨텍스트에 일부 변경 사항이 있음을 의미합니다. 먼저 Add-Migration을 실행하여 수행 한 변경 내용 (알지 못할 수도있는 변경 사항)을 생성 한 다음 Update-Database를 실행하십시오.


2

동일한 문제가 발생했습니다. 마이그레이션을 다시 추가하고 데이터베이스를 업데이트해도 작동하지 않았으며 위의 답변 중 어느 것도 올바르게 보이지 않았습니다. 그런 다음 영감을 얻었습니다. 여러 계층 (웹, 데이터 및 비즈니스)을 사용하고 있습니다. 데이터 계층에는 컨텍스트와 모든 모델이 있습니다. 웹 계층은이 예외를 결코 던지지 않았습니다. 비즈니스 계층이었습니다 (테스트 및 디버깅을위한 콘솔 응용 프로그램으로 설정했습니다). 비즈니스 계층이 올바른 연결 문자열을 사용하여 DB를 가져 와서 컨텍스트를 만들지 않았다는 것이 밝혀졌습니다. 그래서 비즈니스 계층 (및 데이터 계층)의 앱 구성에 연결 문자열을 추가하고 작동합니다. 같은 문제가 발생할 수있는 다른 사람들을 위해 여기에 넣습니다.


1

Database.CompatibleWithModel 메소드 (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

        }

1

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

폴더에 추가 된 두 c # 클래스 파일에 모든 모델과 해당 속성이 포함되어 있는지 확인하십시오.

솔루션을 빌드하고 배포를위한 publis가 모두있는 경우

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


1

누군가가 나와 같은 시나리오를 가지고있는 경우를 대비하여.

데이터베이스에 첫 번째 EF가 있고 asp.net ID를 사용하는 동시에

내 webconfig에 두 개의 connectionStrings가 있으며 문제가 없습니다. asp.net ID 테이블을 수동으로 생성하기 위해 스크립트를 작성 / 실행하여 발생해서는 안됩니다.

따라서 DROP은 먼저 수동으로 / 스크립트에서 생성 한 모든 asp.net ID 테이블입니다.

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

1

이러한 솔루션 중 어느 것도 우리에게 도움이되지 않습니다 (스키마 검사를 완전히 비활성화하는 것 제외). 결국 우리는 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>

우리는 Newtonsoft.json 버전과 비슷한 문제가있었습니다. 버전을 업데이트 할 때 문제가 해결되었습니다.
Rui Estreito

0

이 주제에 대한 조사 결과, 로컬 SQL Server Express에서 이전에 작성된 db 인스턴스가있는 경우 기본적으로 오류가 발생하는 것으로 나타났습니다. 따라서 db에 대한 업데이트가 있고 ;를 Update Database사용하여 명령을 실행하지 않고 db에서 db / run 일부 코드를 업데이트하려고 할 때마다 Package Manager Console; 우선, 로컬 SQL Express에서 수동으로 이전 DB를 삭제해야합니다.

또한이 솔루션은 AutomaticMigrationsEnabled = false;구성에 없는 한 작동 합니다.

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

위에서 언급했듯이 코드 기반으로 이에 대한 몇 가지 솔루션이 있습니다. 그러나 이것은 어떤 경우에는 가장 실용적인 것입니다.


0

Pro ASP.NET MVC 4 서적도 읽었으며 같은 문제가 발생했습니다. 저에게, 나는이 책의 'Adding Model Validation'섹션에서 규정을 변경 한 후에 문제가 발생하기 시작했습니다. 문제를 해결하는 방법은 데이터베이스를 localdb에서 완전한 SQL Server 2012 서버로 옮기는 것입니다. (BTW, 나는 완전한 버전으로 전환 할 수 있기 때문에 운이 좋다는 것을 알고 있으므로 나를 미워하지 마십시오. ;-))) db와의 통신에 문제가있는 것이 있어야합니다.


메타 데이터가 아닌 DB와의 통신임을 어떻게 알 수 있습니까?
flup

2
답장을 늦게 보내서 미안해. 그것은 통신 문제가 아니라는 것이 밝혀졌습니다! 동일한 문제가 다시 발생했기 때문에 db를 다시 만들면 문제가 숨겨졌습니다. __Migrationxxx (방금 제거한 테이블의 정확한 이름을 기억할 수 없음)는 ef에 의해 생성됩니다. 그냥 삭제하면 모든 것이 좋을 것입니다.
J3Speaks

@ MyJ3 모든 사람들은이 모든 코드 라인과 코드 라인을 내뿜습니다. 이게 내가 필요한 전부 야! 답변을받을 자격이 있습니다 (선택적 시나리오).
Terrance00

@ Terrance00 감사합니다!
J3Speaks

0

다음 단계를 확인하십시오

  1. Database.SetInitializer (널); -> Global.asax.cs에서

2.

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

0

다음을 Global.asax.cs포함한 Application_Start이벤트를 포함하여 수정 :

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

5
나는 이것이 개인적으로하는 일에 대해 조금 더 명확해질 것입니다.
Casey

3
아니요 아니요 아니요, DropCreateDatabaseIfModelChanges를 99 % 사용하고 싶지 않습니다!
Tom Stickel

0

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

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

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


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

0

System.Data.Entity를 사용하여 속하는 Database SetInitializer를 사용해보십시오.

Global.asax에서

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

이렇게하면 모델이 변경 될 때마다 새 데이터베이스가 생성되지만 데이터베이스가 비어있을 수 있습니다. 더미 데이터로 채우려면 Seeding을 사용할 수 있습니다. 다음과 같이 구현할 수 있습니다.

시딩 ::

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

}

0

이상하지만 여기의 모든 대답은 쓸모가 없었습니다. 나를 위해 초기화 프로그램을 사용했습니다.

MigrateDatabaseToLatestVersion

여기 내 솔루션이 있습니다 (훨씬 간단 할 수는 있지만 사용 방법입니다).

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은 DropCreateDatabaseAlways에서 상속되므로 특정 경우 (테스트)에서 전체 데이터베이스가 다시 작성됩니다. 그렇지 않으면 최신 버전으로 마이그레이션됩니다.

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


0

두 응용 프로그램에 하나의 데이터베이스를 사용할 때도 같은 문제가 발생했습니다. 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를 참조 하십시오.


0

사용자 정의 컨텍스트 이니셜 라이저를 작성하십시오.

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

Migrations.Configuration은 패키지 관리자 콘솔에서 마이그레이션 명령 줄을 통해 생성되는 클래스입니다. Migrations.Configuration 클래스의 공개 수정자를 내부로 변경해야 할 수도 있습니다.

그리고 OmModelCreating에서 등록하십시오 :

public partial class MyDbContext : DbContext
{

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

        //other code for creating model
    }
}

-1

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

1) DbContext 파일을여십시오

2) Microsoft.AspNet.Identity.EntityFramework를 사용하여 네임 스페이스를 추가하십시오.

3) 공개 MyDbContext () : base ( "name = MyDbContext") {Database.SetInitializer (새 DropCreateDatabaseAlways ()); }

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