복붙노트

[SQL] 엔티티 프레임 워크 4 코드 첫 번째로 사용 오류 데이터베이스

SQL

엔티티 프레임 워크 4 코드 첫 번째로 사용 오류 데이터베이스

나는 DB를 변경하도록 구성되는 MVC3와 EF 4 코드 먼저 응용 프로그램을,이 모델이 변경되었을 때에, TocratesDb 내 파생 DbContext있는 DropCreateDatabaseIfModelChanges 에 DB 이니셜을 설정하여.

지금은 클래스에 속성을 추가하여 모델을 변경했다, 그러나 EF는 DB를 삭제하고 다시 시도 할 때, 나는 다음과 같은 오류가 발생합니다 :

Cannot drop database "Tocrates" because it is currently in use.

나는이 데이터베이스에 어디 개방 전혀 다른 연결이 없습니다. 내 cDbContext 여전히 데이터베이스에 열린 연결이 있다고 가정하지만, 나는 이것에 대해 무엇을 할 수 있습니까?

NEW : 이제 내 문제는 모델을 기반으로 데이터베이스를 다시 작성하는 방법입니다. 더 일반적인 IDatabaseInitializer를 사용하여, 나는 그것을 잃게하고 그것을 자신을 구현해야한다.

해결법

  1. ==============================

    1.현재 컨텍스트는 데이터베이스를 제거 할 수 있도록 열린 연결이 있어야합니다. 문제는 당신의 DB를 초기화를 차단합니다 열려있는 다른 연결이 될 수 있다는 것입니다. 하나의 아주 좋은 예는 관리 스튜디오에서 데이터베이스에서 모든 테이블을 개방하는 데있다. 또 다른 가능한 문제는 응용 프로그램의 연결 풀에서 연결을 열 수 있습니다.

    현재 컨텍스트는 데이터베이스를 제거 할 수 있도록 열린 연결이 있어야합니다. 문제는 당신의 DB를 초기화를 차단합니다 열려있는 다른 연결이 될 수 있다는 것입니다. 하나의 아주 좋은 예는 관리 스튜디오에서 데이터베이스에서 모든 테이블을 개방하는 데있다. 또 다른 가능한 문제는 응용 프로그램의 연결 풀에서 연결을 열 수 있습니다.

    MS SQL이 폐쇄 될 단일 사용자 모드로 스위칭 DB 모든 연결을 강제함으로써, 예를 들어 회피 할 수 있고, 완료되지 않은 트랜잭션 롤백 :

    ALTER DATABASE Tocrates SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    

    먼저이 명령을 호출 한 후 데이터베이스를 삭제하는 새로운 intializer을 만들 수 있습니다. ALTER 데이터베이스 및 DROP 데이터베이스가 동일한 연결에서 호출해야하기 때문에 당신이 자신에 의해 데이터베이스 연결을 처리해야주의하십시오.

    편집하다:

    여기 데코레이터 패턴을 사용하여 예를 들어 있습니다. 당신은 그것을 수정하고 매개 변수로 전달하는 대신 생성자 내부에서 내부 초기화를 초기화 할 수 있습니다.

    public class ForceDeleteInitializer : IDatabaseInitializer<Context>
    {
        private readonly IDatabaseInitializer<Context> _initializer;
    
        public ForceDeleteInitializer(IDatabaseInitializer<Context> innerInitializer)
        {
            _initializer = innerInitializer;    
        }
    
        public void InitializeDatabase(Context context)
        {
            context.Database.SqlCommand("ALTER DATABASE Tocrates SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
            _initializer.InitializeDatabase(context);
        }
    }
    
  2. ==============================

    2.나는이 다중 문 트랜잭션 오류 내에서 허용하지 않은 ALTER DATABASE 문이 실패 EF 6에서 발견.

    나는이 다중 문 트랜잭션 오류 내에서 허용하지 않은 ALTER DATABASE 문이 실패 EF 6에서 발견.

    이 솔루션은 다음과 같은 새로운 거래 행위 오버로드를 사용하는 것이 었습니다 :

    context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, "ALTER DATABASE [" + context.Database.Connection.Database + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
    
  3. ==============================

    3.저도 같은 문제를 가지고 있었다.

    저도 같은 문제를 가지고 있었다.

    난 비주얼 스튜디오의 서버 탐색기보기에서 열린 연결을 종료하여 해결.

  4. ==============================

    4.나는이 일자 실현하지만 난 빠른 솔루션을 압연 그래서 허용 솔루션 작업을 가져올 수 없습니다 ...

    나는이 일자 실현하지만 난 빠른 솔루션을 압연 그래서 허용 솔루션 작업을 가져올 수 없습니다 ...

    using System;
    using System.Data.Entity;
    
    namespace YourCompany.EntityFramework
    {
        public class DropDatabaseInitializer<T> : IDatabaseInitializer<T> where T : DbContext, new()
        {
            public DropDatabaseInitializer(Action<T> seed = null)
            {
                Seed = seed ?? delegate {};
            }
    
            public Action<T> Seed { get; set; }
    
            public void InitializeDatabase(T context)
            {
                if (context.Database.Exists())
                {
                    context.Database.ExecuteSqlCommand("ALTER DATABASE [" + context.Database.Connection.Database + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
                    context.Database.ExecuteSqlCommand("USE master DROP DATABASE [" + context.Database.Connection.Database + "]");
                }
    
                context.Database.Create();
    
                Seed(context);
            }
        }
    }
    

    이것은 저와 지원을 쉽게 파종 작동합니다.

  5. ==============================

    5.비주얼 스튜디오 2012에서 SQL 서버 개체 탐색기 창은 데이터베이스에 대한 연결을 보유 할 수 있습니다. 그것에서 열린 창과 모든 창을 닫으면 연결을 해제합니다.

    비주얼 스튜디오 2012에서 SQL 서버 개체 탐색기 창은 데이터베이스에 대한 연결을 보유 할 수 있습니다. 그것에서 열린 창과 모든 창을 닫으면 연결을 해제합니다.

  6. ==============================

    6.내 전체 프로젝트의 종료하고 다시 열어 간단한 나를 위해 트릭을했다. 그것은 확실히 더 연결이 여전히 열려 없는지 확인하는 가장 쉬운 방법

    내 전체 프로젝트의 종료하고 다시 열어 간단한 나를 위해 트릭을했다. 그것은 확실히 더 연결이 여전히 열려 없는지 확인하는 가장 쉬운 방법

  7. from https://stackoverflow.com/questions/5288996/database-in-use-error-with-entity-framework-4-code-first by cc-by-sa and MIT license