0

기존 데이터베이스에 새 테이블을 만드는 코드를 처음으로 마이그레이션하는 방법을 사용하고 있으며 프로젝트의 어딘가에서 속성 대 필드 매핑을 자동 생성하는지 알고 싶습니다.EF/코드 첫 번째 마이그레이션 - 암시 적 테이블 매핑?

예 : 데이터베이스에 이미 존재하는 "범주"테이블. 그것은 SQL에서 직접 만들어 내 MCV 프로젝트는 명시 적으로 분류 테이블 필드에 범주 개체 속성을 매핑 CategoryMap.cs 파일이되었습니다

CategoryMap.cs

this.ToTable("Category", "ctt"); 
this.Property(t => t.Id).HasColumnName("Id"); 
this.Property(t => t.ClientId).HasColumnName("ClientId"); 
this.Property(t => t.CategoryTypeId).HasColumnName("CategoryTypeId"); 
etc. 

DB를 컨텍스트 클래스를 명시 적으로 OnModelCreating 방법이 매핑을 가리키는 : 나는 자리에 매핑 조각을 지킬 세트 업으로

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Configurations.Add(new CategoryMap()); 
etc. 

, 나는 한 범주 테이블에 데이터를 저장할 수 있습니다. 내 상황에 맞는 클래스에이 코드를 추가

1) "을 MyTable"엔티티 클래스

2 작성) : 한편

, 나는 코드 첫 번째 방법을 사용하여 새 테이블을 만든

public DbSet<MyTable> MyTable { get; set; } 

3) 추가 마이그레이션 및 업데이트 데이터베이스를 실행하여 데이터베이스 스키마에 "을 MyTable"테이블을 생성

명령, 나는이 테이블, desp에 데이터를 저장할 수 있습니다 실제로 매핑 파일이없고 사실 db 문맥 클래스의 OnModelCreating 메서드에 명시적인 매핑 코드가 없다는 사실이 있습니다.

이제 "modelBuilder.Configurations.Add (새 CategoryMap());"을 주석 처리하면됩니다. 컨텍스트 클래스의 코드 줄을 더 이상 해당 테이블에 데이터를 저장할 수 없습니다; db.SaveChanges() 할 때 "테이블 '범주'찾을 수 없습니다"오류 메시지가 나타납니다.

제 질문은 이것입니다. 추가 - 마이그레이션 및 업데이트 데이터베이스 명령을 사용하여 "MyTable"을 만들었을 때 클래스 대 테이블 맵이 자동으로 어딘가에서 생성 되었습니까? 그렇다면 액세스하여 볼 수 있습니까?

+0

'발견되지 않음'오류에 관해서는; 이는 마이그레이션 데이터와 데이터베이스가 동기화되지 않았기 때문일 수 있습니다. 예 : 누군가 SQL에서 직접 Category 테이블을 만들었지 만 마이그레이션에 대해 알지 못합니다.또는 반대로 마이그레이션에 그러한 테이블이 있다고 생각되지만 누군가 테이블을 수동으로 변경하거나 삭제했습니다. 마지막으로 스키마를 기억하십시오. EF에서 기본 스키마를 지정하고 매핑 또는 데이터베이스가 Category 테이블에 대해 다른 스키마를 반영하면이 오류가 발생합니다. – Suamere

답변

2

자동 생성 된 매핑이 없지만 특정 매핑이없는 경우 적용되는 매핑 규칙이 있습니다. 예를 들어 명시 적 테이블 매핑이없는 경우 규칙에 따라 클래스 이름과 일치하는 테이블에 매핑됩니다.

따라서 Category 클래스의 경우 일반적으로 Category이라는 테이블로 매핑됩니다.

이것은 속성에도 해당되므로 Property(t => t.Id).HasColumnName("Id");은 속성에 규칙에 따라 매핑이 있으므로 실제로 수행하지 않습니다. 규칙을 벗어날 때 명시 적 매핑 만 필요합니다. 따라서 속성 ID를 Category_id 열에 매핑하려면 열 매핑이 필요합니다. Property(t => t.Id).HasColumnName("Category_id");

기본 규칙에 대한 자세한 내용은 MSDN 문서를 읽으십시오.

+0

그건 의미가 있습니다. 그러나이 경우 명시적인 범주 매핑을 제거 할 때 "table 'Category'not found"오류가 발생하는 이유는 무엇입니까? 나는 Category 엔티티 클래스를 가지고 있으므로 컨벤션이 "Category"라는 테이블을 찾고 그것을 찾지 않아야합니까? 거의 마치 코드가 첫 번째 마이 그 레이션을 사용하여 작업하기 위해 테이블이 생성 된 것처럼 보입니다. – JMax2012

+0

Category라는 테이블이 있고 그래야만 작동하면 오류가없는 것 같습니다. –

+0

난 빌어 먹을거야. 어떻게 든 "마이그레이션"을 통해 생성 된 "MyTable"테이블은 "dbo"스키마에 있지만 나머지 테이블은 다른 스키마에 있습니다. 그래서 "Category"테이블이 존재하더라도 왜 오류가 발생하는지 설명 할 것입니다. 나는 "범주"가 다른 스키마에 존재하도록 지정하기 위해 OnModelCreating() 메서드를 사용해야한다고 생각하니? – JMax2012

관련 문제