17

EF 쿼리에서 열거 형을 사용할 수 있기를 바랍니다. ExpressionVisitor를 내 저장소에 추가하여 들어오는 조건/사양 기준을 사용하고 해당 지속 된 int 속성을 사용하도록 다시 작성하는 것을 고려하고 있습니다.쿼리 표현식을 다시 작성하여 열거 형을 int로 바꾸십시오.

public class User : IEntity 
{ 
    public long ID { get; set; } 

    internal int MemberStatusValue { get; set; } 

    public MemberStatus MemberStatus 
    { 
     get { return (MemberStatus) MemberStatusValue; } 
     set { MemberStatusValue = (int) value; } 
    } 
} 

을 그리고 사용하여 데이터베이스에 다음이지도 :

나는 일관되게 내 (코드 첫 번째) 기관에 다음과 같은 가치 접미사 패턴을 사용하고 있습니다에서

internal class UserMapping : AbstractMappingProvider<User> 
{ 
    public override void DefineModel(DbModelBuilder modelBuilder) 
    { 
     // adds ToTable and other general mappings 
     base.DefineModel(modelBuilder); 

     Map.Property(e => e.MemberStatusValue).HasColumnName("MemberStatus"); 
    } 
} 

을 내

public IQueryable<T> Query(Expression<Func<T, bool>> filter, params string[] children) 
{ 
    if(children == null || children.Length == 0) 
    { 
     return Objects.Where(filter); 
    } 
    DbQuery<T> query = children.Aggregate<string, DbQuery<T>>(Objects, (current, child) => current.Include(child)); 
    return filter != null ? query.Where(filter) : query; 
} 

내가이 메타 내부 메서드 호출을 추가하고 싶습니다 : 저장소가 나는 다음과 같은 방법을 필터 식을 다시 작성하여 MemberStatus 속성에 대한 모든 참조를 MemberStatusValue에 대한 참조로 바꿉니다.

나는 in this SO post과 같은 것을 포함하는 해결책이 될 것이라고 생각하지만, 아이디어를 구현하는 방법을 정확히 알지 못합니다.

이 기능을 추가하면 성능에 미치는 영향에 대한 조언을 제공 할 수 있습니다.

+1

것은이 게시물을 살펴 보자 http://bit.ly/eUOi08 – Steven

+0

감사합니다, 정확히 바로 보이는 .. 조사 할 것입니다! –

+3

최신 버전의 EF (June CTP)는 열거 형에 대한 기본 지원을 제공하며 다음 공식 릴리스 (4.2)는 공식 버전으로 설정됩니다 (http://blogs.msdn.com/b/adonet/archive/2011). /06/30/walkthrough-enums-june-ctp.aspx –

답변

1

이것이 꽤 있는지 여부는 잘 모르겠지만 유사하지만 약간 다른 방식으로 enum을 처리하는 것이 더 간단하다는 것을 알았습니다. 지혜롭게 말하면, 나는 당신처럼 두 개의 속성을 가지고 있지만 int 속성은 public이며 데이터베이스가 지속되는 속성입니다. 그런 다음 다른 "래퍼"속성을 가져 와서 원하는 응용 프로그램의 나머지 부분에서 실제로 사용되는 원하는 열거 형식으로/통해 캐스팅을 통해 int 속성 값을 가져 오거나 설정합니다.

결과적으로 모델을 둘러 볼 필요가 없습니다. EF는 int 속성을 이해하고 유지하지만 나머지 응용 프로그램은 enum 형식과 좋은 상호 작용을합니다. 내 접근 방식에 대해 마음에 들지 않는 유일한 점은 실제로 유지되는 필드에 대해 일치시킬 int로 변환하도록 쿼리하려고하는 모든 열거 형 값에 대한 캐스트가있는 LINQ 문을 작성해야한다는 것입니다. 그러나 LINQ가 제공하는 모든 유형 안전, Intellisense 등을 제공하는 쿼리를 생성하기 위해 문자열을 사용하고있는 것처럼 보였기 때문에 약간의 가격이었습니다.

마지막으로 EF 5에서 새로운 열거 형 기능을 사용하는 방법에 대해 알아 보려면 (지금 사용해 보려면 사용하려면 지금 베타 버전으로 제공됩니다)

http://msdn.microsoft.com/en-us/hh859576

+0

고마워,하지만 당신은 몇 가지 항목에 대한 표시를 놓쳤습니다. 나는 문자열을 사용하지 않고 그대로 int를 유지합니다.내 두 속성과 매핑의 이유는 int 값을 enum 속성 다음에 명명 된 열에 매핑하기 때문에 나중에 일부 단계에서 EF5로 쉽게 전환 할 수 있습니다. 내 쿼리는 귀하의 int를 사용하지만 캐스팅을 사용해야하는 불편 함을 느낍니다. 특히 쿼리에서 열거 형을 캐스팅 할 수 없으므로 변수를 선언해야합니다. 내가 찾고있는 대답은 쿼리 식 그래프를 다시 작성하고 열거 형 변환을 수행하는 코드를 제공해야합니다. –

관련 문제