2013-03-31 3 views
1

최근에 EF Reverse Engineer Code First를 사용하여 기존 데이터베이스를 코드로 변환했습니다. 대부분의 결과를 연마 한 후에 테스트를 쓰기 시작했습니다. 현재 가지고있는 오류는 'Element_ElementCode'라는 열 이름에 액세스하려고 시도하지만 해당 열은 없습니다.
필자는 실수로이를 선언 할 가능성을 피하기 위해 전체 프로젝트를 검색했습니다.SQLException : 잘못된 열 이름

System.Data.SqlClient.SqlException: Invalid column name 'Element_ElementCode'. 

잘못된 열 이름 'Element_ElementCode는'반복되는 10 ~ 15 번과 스택 트레이스가 어떤 단서를 제공하지 않습니다 다음과 같이

Find all "Element_ElementCode", Subfolders, Find Results 1, Entire Solution, "" 
Matching lines: 0 Matching files: 0 Total files searched: 120 

정확한 오류입니다.

이 예외는 데이터를 검색하는식이 포함 된 테스트를 실행하고 일부식이를 수행 할 때 발생합니다. enter image description here

Element (Element.cs 내부) 다음과 같은 필드가 있습니다 :

var doos = (dbContext.Elementen.Where(d => d.ElementCode == "DOOS9001")).FirstOrDefault(); 

는 SQL 서버 자체에서 쿼리의 결과

ElementCode 
Doelgroep 
Type 
Omschrijving 
Titel 

요소는 다음과 같이 매핑됩니다 :

public class ElementenMap : EntityTypeConfiguration<Element> { 
     public ElementenMap() { 

      // Primary Key 
      this.HasKey(t => t.ElementCode); 

      // Properties 
      this.Property(t => t.ElementCode) 
       .IsRequired() 
       .HasMaxLength(255); 

      this.Property(t => t.Type) 
       .HasMaxLength(31); 

      this.Property(t => t.Doelgroep) 
       .HasMaxLength(255); 

      this.Property(t => t.Omschrijving) 
       .HasMaxLength(255); 

      this.Property(t => t.Titel) 
       .HasMaxLength(255); 

      // Table & Column Mappings 
      this.ToTable("Elementen"); 
      this.Property(t => t.ElementCode).HasColumnName("ElementCode"); 
      this.Property(t => t.Type).HasColumnName("Type"); 
      this.Property(t => t.Doelgroep).HasColumnName("Doelgroep"); 
      this.Property(t => t.Omschrijving).HasColumnName("Omschrijving"); 
      this.Property(t => t.Titel).HasColumnName("Titel"); 

      // Relationships 
      this.HasMany(t => t.Kernwoorden) 
       .WithRequired(t => t.Element) 
       .Map(m => m.ToTable("Kernwoorden")); 
     } 
    } 

더 : 나는 동일한 데이터베이스 내의 다른 테이블에 대한 다른 테스트가 성공하기 때문에 데이터베이스에 액세스했는지 확신합니다.

가능한 한 많은 관련 정보를 제공하려고 노력했지만 소스를 잊어 버린 경우 알려 주시기 바랍니다. Element_ElementCode이라는 열에 액세스하려는 이유는 무엇입니까? 아마도 잊어 버린 국제 대회 (이미 PluralizingTableNameConvention를 해제해야했습니다)입니까?

어떤 방향으로 이걸 찾아야합니까?

편집 :

Kernwoord.cs

public class Kernwoord { 
     public string ElementCode { get; set; } 

     public string KernwoordString { get; set; } 

     public virtual Element Element { get; set; } 
    } 

Element.cs

public partial class Element { 
     public Element() { 
      this.LeertrajectElementen = new List<LeertrajectElement>(); 
      this.Kernwoorden = new List<Kernwoord>(); 
     } 

     public string ElementCode { get; set; } 

     public string Type { get; set; } 

     public string Doelgroep { get; set; } 

     public string Omschrijving { get; set; } 

     public string Titel { get; set; } 

     public virtual Casus Casus { get; set; } 

     public virtual Document Document { get; set; } 

     public virtual Doos Doos { get; set; } 

     public virtual ICollection<LeertrajectElement> LeertrajectElementen { get; set; } 

     public virtual StellingenSpel StellingenSpel { get; set; } 

     public virtual ICollection<Kernwoord> Kernwoorden { get; set; } 
    } 

LeertrajectElementenMap.cs는 니펫을 :

this.HasRequired(t => t.Element) 
    .WithMany(t => t.LeertrajectElementen) 
    .HasForeignKey(d => d.ElementCode); 

편집 : 문제는 기존의 상속 문제를 해결함으로써 해결되었다

.

+0

을 (t => t.ElementCode)이 있어야한다. HasColumnName ("ElementCode"); 및 .Map (m => m.ToTable ("Kernwoorden"));'. 나는 모든 '수동'이름 지정 (어쨌든 모두 동일 함)을 삭제하고 w/o 시도하도록 제안합니다. 당신은 너무 많은 일을하고 있습니다. EF를 혼란스럽게합니다. – NSGaga

+0

별다른 차이는 없지만 아래의 설명에 나와있는 것과 비슷한 (그러나 여전히 해결책은 아닙니다) 것으로 조정했습니다. 이것이 EF에 의해 자동 생성된다는 것을주의하십시오, 혼동해서는 안됩니다! –

+0

우리가 빨리 테스트 할 수있는 전체 모델을 가지고있는 것이 더 쉬울 것입니다. – NSGaga

답변

1

관계의 외부 키 열 이름을 지정하지 마십시오. 당신이 Kernwoorden 클래스의 외래 키 특성ElementCode이있는 경우,

this.HasMany(t => t.Kernwoorden) 
    .WithRequired(t => t.Element) 
    .Map(m => m.MapKey("ElementCode")); // FK column name in Kernwoorden table 

또는 : 당신은`this.Property을지도 할 이유

this.HasMany(t => t.Kernwoorden) 
    .WithRequired(t => t.Element) 
    .HasForeignKey(t => t.ElementCode); 
+0

이것은 작성되지 않았습니다. 차이. 내가 들여다 봐야 할 곳이 틀림 없다고 확신 할 수 있니? 'Kernwoorden' 테이블은 단지'ElementCode'와'Kernwoord' 칼럼으로 구성되어 있습니다. 그리고 데이터베이스 다이어그램을 보면'ElementCode'에 FK와 함께 링크되어있는 것을 볼 수 있습니다. –

+0

@JeroenVannevel : 글쎄요, 어딘가에 EF에게'Kernwoorden' 테이블의'ElementCode'가 ** FK라고 말해야합니다. 그렇지 않으면 "NavigationPropertyNameInDependent + underscore + PKNameInPrincipial"인 규칙에 따라 FK 컬럼 이름을 취할 것입니다. 'Kernvoorden' 클래스에 탐색 속성'Element'가 있다면'Element_ElementCode'입니다. 'Kernvoorden'과'Element' 클래스를 키와 탐색 속성으로 보여줄 수 있다면 도움이 될 것입니다. – Slauma

+0

요청한 정보로 내 게시물을 편집했습니다. EF Code First에서 생성 된 코드를 편집하는 중이므로 아직 해결해야 할 몇 가지 문제가 있습니다. 어떤 이유로 EF는'Element' 클래스에 대한 모든 링크를 링크 된 클래스의 속성으로 변환했습니다. 'Element' 자체는 추상 클래스이고 몇 개의 속성을 가져야합니다. 다른 클래스는 이것으로부터 상속 받아 자신의 속성을 추가합니다. 현재, 그것들은 모두 'Element'속성을 가지고있는 것으로 번역됩니다. 이것이 문제라고 생각하십니까? –

0

유형에 대한 보호가 있습니다.

예를 들어 고객이 있고 해당 고객이 유일한 하나의 주소를 가지고 있고 주소에 우편 번호가있는 경우.

그러면 Adress_Postcode 필드가있는 고객 테이블이 생성됩니다.

귀하의 경우에는 클래스 이름과 테이블 이름이 다르기 때문에 유형 Element를 테이블 Elementen에 넣고 있습니다.

+0

어떤 컨벤션을 금지해야하는지 알고 있습니까? –

+0

클래스 이름을 테이블과 동일하게 변경하십시오 –

+0

다른 옵션이 없다면이 방법을 사용하십시오 (솔직히 놀라게 할 것입니다) –