2012-04-05 2 views
4

내가 당신의 전형적인 정보를 포함 사용자라는 테이블을 가지고 말EntityFramework 4.1 코드 먼저 잘못 이름 복합 유형 열 이름

http://weblogs.asp.net/manavi/archive/2010/12/11/entity-association-mapping-with-code-first-part-1-one-to-one-associations.aspx합니다. 무엇보다도

는,이 문서가 상태 :. 코드 먼저 클래스를 발견하는 경우

"코드 먼저 규칙의 집합을 기반으로 작품 복잡한 유형 탐색의 개념이 협약은 그 어디 기본 키가 없습니다 유추되고 데이터 주석 또는 유창한 API를 통해 기본 키가 등록되지 않으면 유형이 자동으로 복합 유형으로 등록됩니다. 복합 유형 감지를 사용하려면 유형에 엔티티 유형을 참조하는 특성이 없습니다 (즉 모든 특성 스칼라 유형이어야 함) 다른 유형의 컬렉션 속성에서 참조되지 않습니다. " My Address 클래스는 다음 기준을 충족합니다. 문자열로 구성되어 있으며 다른 곳에서는 사용되지 않습니다.

이 앱에서는 차이점이 있는지 확실하지 않지만 Google에서는 사용자를 기술 (예 : Techs)이라고 부릅니다. 각 Tech가 자체 주소를 가질 수 있도록 사용자의 주소 열을 주소로 분할하고 싶습니다. 위의 기사에 따르면, EF는 이것을 추론하고 복합 유형을 자동으로 처리해야합니다. 내가 갖는 어떤 상황이 나에게 기술을 제공하려고 할 때,하지만, 다음과 같은 예외 :

System.Data.EntityCommandExecutionException: An error occurred while executing t 
he command definition. See the inner exception for details. ---> System.Data.Sql 
Client.SqlException: Invalid column name 'Address_Street'. 
Invalid column name 'Address_City'. 
Invalid column name 'Address_State'. 
Invalid column name 'Address_Zip'. 

는 Tech.Address 속성의 의미를하려고하지만, 각주는 것 같습니다 하위 속성에 잘못된 이름이 있습니다 (예 : '도시'대신 'Address_City').

어떻게 해결할 수 있습니까?

답변

5

올바른 동작입니다. 기본 규칙은 항상 복합 유형에 매핑 된 속성 앞에 유형 이름을 붙입니다.

public class Address 
{ 
    [Column("City")] 
    public string City { get; set; } 
    ... 
} 

또는 유창하게 API를 통해 : 서로 다른 열 이름을 사용하려면 당신도 데이터 주석을 통해 매핑해야합니다

modelBuilder.ComplexType<Address>().Property(a => a.City).HasColumnName("City"); 
+1

OK, 좋은 소리. 나는 단지 내가 틀린 일을하고 있지 않다는 것을 확실히하고 싶었다. 제가 읽은 기사는 제가 매핑을 할 필요가 없다고 생각했습니다. 나는 그것을 잘못 읽었을 것임에 틀림 없다. 이렇게 빨리 저에게 돌아와 줘서 고마워요. – RobC

+0

더 규칙적인 방식으로 기본 규칙을 변경할 방법이 없습니까? 열 이름의 하드 코딩을 좋아하지 않습니다 ... –

+0

@Cristi : EF는 현재 사용자 지정 규칙을 지원하지 않습니다. 할 수있는 일은 유창한 API를 사용하고'a => a.City'와 같은 간단한 표현식을 탐색하여 칼럼의 이름을 얻는 것입니다. –