2011-03-13 6 views
5

나는 ASP.Net Movie Database Tutorial을 따라 왔으며 모두 잘 진행되었습니다.MVC3/EF - 모델 변경 중 ... 데이터베이스 스키마 불일치

방금 ​​모델을 변경하고 속성을 추가했습니다. 호기심을 불러 일으키지 만 데이터베이스를 삭제하는 지침을 따르고 싶지는 않습니다. 수정할 수 있는지 알고 싶었습니다.

correct error은 불일치에 관한 것으로 나타났습니다.

등급 열을 데이터베이스에 추가했는데 모든 것이 작동했습니다. 내가 튜토리얼을 따라 약 DropCreateDatabaseIfModelChanges 배우고 싶었다로

다음, 나는 등급 열을 삭제 -하지만 난 그냥 모든 시간에 오류 Invalid column name 'Ratings'.

를 얻을 수는 ModelHash 항목이 변경되지 않은, 나는이 지금이나 이전에 차이가 있다는 것을 어떻게 알았는지 모르겠다.

그래서 - 1) 내가 뭔가를 망쳤습니까?

2) 어떻게 수정할 수 있습니까?

3) 이전에 해시가 변경되지 않았지만 변경된 사항은 어떻게 알 수 있었습니까?

4) 추가적인 조언이 있습니까?

답변

5

올바른 동작으로 인해 수동으로 추가 된 Rating 열의 예외가 throw되므로 설명을 잘못 입력했다고 생각합니다.

데이터베이스가 새 테이블을 생성
  1. EdmMetadata이 추가됩니다라는 다음과 같이

    이 문제는 작동합니다.

  2. EdmMetadata에는 두 개의 열, 즉 IdModelHash이 있습니다.
  3. 데이터베이스 생성 부분에 현재 행의 해시가있는 단일 행이 저장됩니다.
  4. 현재 컨텍스트에서 데이터베이스를 만들지 않은 경우 컨텍스트는 쿼리를 실행하여 첫 번째 작업이 실행되기 전에 저장된 모델 해시를 검색합니다. 검색된 has는 컨텍스트의 현재 해시와 비교됩니다.
  5. hash가 동일하지 않고 데이터베이스 초기화가 데이터베이스 초기화 프로그램에서 허용하지 않는 경우 예외가 발생합니다.
  6. 해시가 동일한 경우 필수 db 작업이 실행됩니다.

수동으로 Rating 열을 추가해도 저장된 해시는 변경되지 않지만 모델의 해시는 달라집니다.

이 문제가 완전히 IncludeMetadataConvention 대회 제거하여 제거 할 수 있습니다 :

protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Conventions.Remove(modelBuilder.Conventions 
      .OfType<IncludeMetadataConvention>().ToArray()); 
    } 
+0

음을 - 나는 내가 말한 것은 내가 한 정확히 ... 내가 잘하는 가이드를 따라 있음을 보장 할 수 있습니다 - 제공된 모델을 수정 그때 그들이 제안한 스크립트를 삭제/작성하는 대신에 예외적으로 열을 추가하고 그냥 잘 동작했습니다. – Wil

+0

@Wil : 흥미 롭습니다. 난 그냥 콘솔 응용 프로그램에서 동일한 짓을하고 수동으로 테이블에 열을 추가 문제를 해결하지 않았다. –

+0

내 오래된 질문 중 몇 가지를 살펴보십시오 ... 다시 말하지만, 나는 사건의 순서에 대해 당신을 보장 할 수 있습니다. 그러나 이것에 관해서 나보다 훨씬 더 많은 것을 알 것입니다. 다른 일이 벌어졌을 것입니다. 답변으로 표시하고 내가 시간이 있으면 미래에 표시를 해제 할 수 있습니다/다시 재현 할 수 있습니다. +1 감사합니다. – Wil

관련 문제