2012-01-03 4 views
2

나는 이것이 NHibernate와 작동한다는 것을 알고있다. 그러나 나는 EF code-first를 처음 접했고 그것을 끝내는 방법을 알 수있다. 한마디로암시 적 변환이있는 형식을 Entity Framework에 매핑 할 수 있습니까?

, 나는 문자열 (또는 int 또는 DateTime 또는 무엇이든)이 있었다 BazCode 것처럼 BazCode이 유형 /에서 암시 적 변환이 있기 때문에, 유형 BazCode 내 엔티티 FooEntity에 속성을 매핑 할. 사용량

public class FooEntity 
{ 
    public int FooId { get; set; } 
    public string SomeText { get; set; } 
    public BazCode Code { get; set; } 
} 

public class BazCode 
{ 
    private readonly string _value; 

    private BazCode(string s) 
    { 
     if(s.Length != 8) 
     { 
      throw new ArgumentException("BazCode must be 8 characters.") 
     } 

     _value = s; 
    } 

    public static implicit operator BazCode(string s) 
    { 
     return new BazCode(s); 
    } 

    public static implicit operator string(BazCode code) 
    { 
     return code._value; 
    } 
} 

:

var foo = new FooEntity 
{ 
    SomeText = "here is some text", 
    Code = "A1234567" 
} 

BazCode 때문에 암시 적 문자열에서, 나는 그냥 작동 일반적으로 NHibernate에의 매핑 할 수 /에 캐스트 할 수 있습니다.

EF를 사용하면 명시 적으로 매핑을 정의하는 유일한 방법은 익명 형식 생성자를 사용하는 것입니다. 그러나 캐스트를 사용할 수 없으므로 아무 것도 구입하지 않습니다.

나는 EF의 복잡한 유형 개념을 알고 있지만, 지금까지 내가 말할 수있는 것과 같은 것은 아니다. 나는 필요한 것이라고 생각 :

context.Foos.Where(foo => foo.BazCode.Value == "B9876543") 

대신

context.Foos.Where(foo => foo.BazCode == "B9876543") 

이 전혀 암시 적 변환을 활용하지 않습니다.

EF에서 엔티티를 매핑하거나 암시 적 변환을 허용하는 좀 더 정교한 방법이 있습니까?

+0

NH이 마지막 줄을 어떻게 다룰 수 있는지 궁금합니다. 변환 뒤의'=='연산자는 (잠재적으로 임의의 복잡한) C# 코드입니다. 모든 경우에이 방법을 사용하여 데이터베이스로 쿼리를 실행하기 위해 SQL로 변환 할 수 있습니까? 또는 NH이 어떻게 든 변환 연산자의 내용을 "구문 분석"하고 변환 할 수 있으면 SQL로 변환합니까? EF의 경우,'BazCode'가 복합 형이라 할지라도 마지막 줄은 불가능하다고 확신합니다. EF는 엔티티를 매핑하는 방법을 가지고 있지만 슬프게도 그 중 어느 것도 "세련된"것은 아닙니다. 귀하의 경우에는'BazCode' 속성을'string'으로 대체 할 것입니다. – Slauma

답변

1

번호 EF는 few basic types 및 복합 유형 만 지원합니다. 지원되는 변환이 없습니다 (EF도 명시 적으로 변환을 작성할 수 없습니다). 또한 주석에서 @Slauma에 언급 된 바와 같이 C# 변환 논리가 SQL로 변환되지 않으므로 암시 적 변환은 Linq와 엔터티간에 의미가 없습니다.

관련 문제