2013-05-15 8 views
0

데이터베이스에 마이 그 레이션을 적용하려고합니다.마이그레이션을 적용 할 수 없습니다.

초기에는 DB가 역 엔지니어링되어 EF 전동 공구를 사용하여 먼저 코드가 작성되었습니다. 내 데이터베이스에서 테이블 이름은 모두 tbl_ [NAME] (으)로 시작하므로 역 엔지니어링 프로세스가 완료된 후 모든 모델에 동일한 규칙이 적용됩니다. 모델 이름이 각 모델의 modelMAP에있는 테이블 이름에 매핑되었으므로 마이그레이션을 만들 때 "tbl_"을 제거하기 위해 생성 된 모든 모델의 이름을 바꾸고 "UP"메소드를 살펴 보았습니다. EF는 모든 영향을받은 테이블, 모든 테이블에 대해 DropForeignKey를 원하고 테이블을 드롭합니다. 뭐?

내 DB가 크기 때문에 이전 UP 방법에서 몇 줄의 코드 만 표시합니다. 내가 EF는 모든 테이블을 삭제하고 내 실험에서 문제가되지 않습니다 다시 작성하기로 결정 이유를 잘 모르겠습니다하지만 그래서

DropForeignKey("dbo.tbl_AssetFileLocations", "AssetFileID", "dbo.tbl_AssetFiles"); 
DropForeignKey("dbo.tbl_AssetFileLocations", "StorageLocationID", "dbo.tbl_StorageLocations"); 
... 
DROP ALL FOREIGN KEYS ON ALL TABLES 
... 

DropIndex("dbo.tbl_AssetFileLocations", new[] { "AssetFileID" }); 
DropIndex("dbo.tbl_AssetFileLocations", new[] { "StorageLocationID" }); 
... 
DROP ALL INDEXES 
... 


CreateTable(
    "dbo.tbl_AssetFileLocations", 
    c => new 
     { 
      AssetLocationID = c.Guid(nullable: false), 
      AssetFileID = c.Guid(nullable: false), 
      StorageLocationID = c.Guid(nullable: false), 
      DateCreatedonStorage = c.DateTime(nullable: false), 
     }) 
    .PrimaryKey(t => t.AssetLocationID) 
    .ForeignKey("dbo.tbl_AssetFiles", t => t.AssetFileID, cascadeDelete: true) 
    .ForeignKey("dbo.tbl_StorageLocations", t => t.StorageLocationID, cascadeDelete: true)  
    .Index(t => t.AssetFileID) 
    .Index(t => t.StorageLocationID); 

... 
CREATE ALL OTHER TABLES 
... 

DropTable("dbo.tbl_AssetFileLocations"); 

... 
DROP ALL TABLES 
... 

나는 데이터베이스에 데이터가 없습니다. 그러나 나는 변화 모델 이름은 전체 데이터베이스 재 구축의 원인이 이유를 이해하고자하는 (새로운 이름은 DB 리버스 엔지니어링 할 때 같은 테이블 이름에 매핑!)

내 주요 문제

시도 할 때 마이그레이션을 적용하기 위해 나는 순환적인 오류 폭풍에 처하게된다.

첫 번째 시도에서 오류가 발생합니다. FK_dbo.tbl_AssetFileLocations_dbo.tbl_AssetFiles_AssetFileID '는 (는) 제약이 아닙니다. 제약 조건을 삭제할 수 없습니다. 이전 오류를 참조하십시오.

이렇게 생각하겠습니다. DropForeignKey를 주석 처리합니다. //DropForeignKey("dbo.tbl_AssetFileLocations ","AssetFileID ","dbo.tbl_AssetFiles ");

다음 dropForeignKey에서 같은 (문맥 상) 오류가 발생하여 오류가 발생합니다. 그래서 실험으로 모든 DropForeignKey 문을 주석 처리합니다.

다시 실행 업데이트 데이터베이스 명령은 다음 오류 메시지가 발생합니다

인덱스를 삭제할 수 없습니다 'dbo.tbl_AssetFileLocations.IX_AssetFileID'가 존재하지 않거나 권한이 없으므로.

그리고 하나씩 차례로 모든 DropIndex 문에 대해 불평합니다. 그래서 실험으로 나는 모든 것을 주석 처리하고 데이터베이스를 업데이트하려고 시도합니다.

UP 메소드가 시도하는 다음 작업을 볼 수 있듯이 모든 테이블 추가! 물론 오류가 발생합니다 : 이미 데이터베이스에 'tbl_AssetFileLocations'라는 개체가 있습니다.

그래서 나는 여기에서 약간 둔한 당신을 생각합니다. 당신이 그들을 만든 후에 테이블을 떨어 뜨리려고합니다! 그래서 Drop Table 명령의 순서를 변경하여 Table 작성 명령 앞에 오게하십시오. 더 이해하기 쉽습니다.

이것은 처음 EF 코드를 사용한 실험이며 마이그레이션은 모두 멋지다. EF가 전체 DB 스키마를 삭제하고 다시 작성하게되어 기쁩니다.

객체 'DBO를 삭제할 수 없습니다 :

그래서 테이블 삭제가 올바른 위치에 지금 명령으로, 나는 마지막 원형 오류를 얻기 위해 업데이트-데이터베이스를 다시 실행.tbl_Assets '는 FOREIGN KEY 제약 조건에 의해 참조되기 때문입니다.

는 그리고 나 자신에게 내가

.,이 운동의 시작 부분에 드롭을 거부 YES, 즉 FOREIGN KEY 제약 조건이있어 "생각 그래서 여기에서 어디로 가야합니까.이 실험에서는 것을 나타납니다 코드 - 우선 마이그레이션은 모든 작동하지 않지만 간단한 예는 EF 웹 사이트에 주어진!

사람이 코드를 변경하고 DB에 그 마이그레이션에 큰 DB를 설계하고 성공적으로 리버스했습니다 ?

내가 잊지해야 코드 우선 (code-first)을 먼저하고 데이터베이스 (Database)로 먼저 돌아가십시오. (저는 처음부터 코드의 아이디어를 좋아합니다.)

EF 인력을 도우십시오.

+1

전체 질문에 대한 답변이 정확하지는 않지만 리버스 엔지니어링이 마이그레이션을 수행하면 나에게도 약간의 문제가 발생합니다. 여기에 내 질문을 참조하고 도움이 될 수있는 멋진 답변 : http://stackoverflow.com/questions/17736708/unable-to-run-ef5-migration-with-existing-database – Steve

+0

기본적으로 DB를 리버스 엔지니어링하고 비어 있음 마이그레이션 및 통화 업데이트 데이터베이스에 액세스 할 수 있습니다. – Steve

답변

0

데이터베이스의 테이블이 아니라 컨텍스트 클래스의 이름을 바꾸시겠습니까?

처음부터 컨텍스트를 다시 생성 한 다음 코드를 리 팩터링/이름 변경하기 전에 [TableName ("tbl_ContextClassName")] 특성을 추가하십시오.

내 생각에 데이터베이스가 변경되지 않으면 모든 클래스 이름과 속성 이름에 특성이 설정된 데이터베이스 이름이있는 경우에만 리팩터링해야 할 것입니다. 속성의 이름을 바꾸면 클래스 이름을 바꾸고 열의 이름을 바꿀 때 테이블의 이름을 변경합니다.

관련 문제