[SQL] 엔티티 프레임 워크 4 코드 첫 번째로 사용 오류 데이터베이스
SQL엔티티 프레임 워크 4 코드 첫 번째로 사용 오류 데이터베이스
나는 DB를 변경하도록 구성되는 MVC3와 EF 4 코드 먼저 응용 프로그램을,이 모델이 변경되었을 때에, TocratesDb 내 파생 DbContext있는 DropCreateDatabaseIfModelChanges
지금은 클래스에 속성을 추가하여 모델을 변경했다, 그러나 EF는 DB를 삭제하고 다시 시도 할 때, 나는 다음과 같은 오류가 발생합니다 :
Cannot drop database "Tocrates" because it is currently in use.
나는이 데이터베이스에 어디 개방 전혀 다른 연결이 없습니다. 내 cDbContext 여전히 데이터베이스에 열린 연결이 있다고 가정하지만, 나는 이것에 대해 무엇을 할 수 있습니까?
NEW : 이제 내 문제는 모델을 기반으로 데이터베이스를 다시 작성하는 방법입니다. 더 일반적인 IDatabaseInitializer를 사용하여, 나는 그것을 잃게하고 그것을 자신을 구현해야한다.
해결법
-
==============================
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.나는이 다중 문 트랜잭션 오류 내에서 허용하지 않은 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.저도 같은 문제를 가지고 있었다.
저도 같은 문제를 가지고 있었다.
난 비주얼 스튜디오의 서버 탐색기보기에서 열린 연결을 종료하여 해결.
-
==============================
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.비주얼 스튜디오 2012에서 SQL 서버 개체 탐색기 창은 데이터베이스에 대한 연결을 보유 할 수 있습니다. 그것에서 열린 창과 모든 창을 닫으면 연결을 해제합니다.
비주얼 스튜디오 2012에서 SQL 서버 개체 탐색기 창은 데이터베이스에 대한 연결을 보유 할 수 있습니다. 그것에서 열린 창과 모든 창을 닫으면 연결을 해제합니다.
-
==============================
6.내 전체 프로젝트의 종료하고 다시 열어 간단한 나를 위해 트릭을했다. 그것은 확실히 더 연결이 여전히 열려 없는지 확인하는 가장 쉬운 방법
내 전체 프로젝트의 종료하고 다시 열어 간단한 나를 위해 트릭을했다. 그것은 확실히 더 연결이 여전히 열려 없는지 확인하는 가장 쉬운 방법
from https://stackoverflow.com/questions/5288996/database-in-use-error-with-entity-framework-4-code-first by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL은 부울 값 부울 VS TINYINT (1) (0) | 2020.06.02 |
---|---|
[SQL] 우리는 그것없이 가입 할 수있을 때 왜 기본 - 외부 키 관계가 필요합니까? (0) | 2020.06.02 |
[SQL] 왼쪽은 왼쪽 테이블에서 중복 행없이 가입 (0) | 2020.06.02 |
[SQL] MySQL의 : LEFT와 GROUP_CONCAT는 가입 (0) | 2020.06.01 |
[SQL] 하나의 ID 열이있는 테이블에 행을 삽입 만 (0) | 2020.06.01 |