2

편의상 내포 된 enum을 가진 여러 참조 엔터티가 있습니다. 예를 들어 :매핑에서 중첩 열거 형을 무시하는 방법

public class StatusA 
{ 
    public enum Values 
    { 
     Active = 1, 
     Inactive = 2, 
     InProgress = 3 
    } 
} 

public class StatusB 
{ 
    public enum Values 
    { 
     Sent = 1, 
     Accepted = 2, 
     Expired = 3 
    } 
} 

public class EntityA 
{ 
    public StatusA.Values Status {get; set;} 
} 

public class EntityB 
{ 
    public StatusB.Values Status {get; set;} 
} 

을 나는 모델 구성시 다음과 같은 예외를 받고 있어요 : 유형 'StatusA + 값'과 유형 'StatusB + 값'모두 '값'같은 간단한 이름이를 따라서 같은 모델에서 사용할 수 없습니다. 주어진 모델의 모든 유형은 고유 한 단순한 이름을 가져야합니다. 'NotMappedAttribute'를 사용하거나 Code First Fluent API에서 Ignore를 호출하여 모델에서 속성이나 유형을 명시 적으로 제외합니다.

고치려고했는데 NotMappedAttribute가 enum에 적용 할 수 없다는 것을 알았습니다. 유창한 API 인 .Ignore<T> (열거 형이 아닌 참조 유형도 필요) 및 .Ignore(IEnumerable<Type>)을 사용해 보았지만 행운은 없습니다. Google 검색은별로 도움이되지 못했습니다.

이러한 열거 형을 모델에서 제외시키는 다른 방법이 있습니까?

+0

비공개로 시도 했습니까? –

+0

감사하지만 공개해야합니다. –

답변

2

실제로 해당 유형의 속성을 포함하는 경우에만 모델에 열거 유형을 가져야합니다. 그렇게하면 유형을 무시할 수 없으며 특성을 무시하지 않습니다. 그리고 테스트는 그 속성을 무시하는 것이 유형을 무시하기에 충분하다는 것을 보여줍니다. 여기

당신이 받고있는 예외 얻을 수있는 최소한의 완전한 테스트 프로그램 :만큼 # 1과 # 2는 모델의 두 부분이 분명해야한다

using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 

public class A 
{ 
    public int Id { get; set; } 

    public E P { get; set; } // #1 

    public enum E { } 
} 

public class B 
{ 
    public int Id { get; set; } 

    public E P { get; set; } // #2 

    public enum E { } 
} 

static class Program 
{ 
    static void Main() 
    { 
     var modelBuilder = new DbModelBuilder(DbModelBuilderVersion.Latest); 
     modelBuilder.Entity<A>(); 
     modelBuilder.Entity<B>(); 
     var model = modelBuilder.Build(new DbProviderInfo("System.Data.SqlClient", "2012")); 
    } 
} 

을, 당신은 매핑을 피할 수 없다 열거 형 # 1 또는 # 2 (또는 둘 다)를 제거하거나 이라고 표기하면 NotMapped 속성을 사용하여을 표시하면 더 이상 예외가 발생하지 않습니다.

당신 당신과 같이, 해당 유형의 속성을 매핑 피할 수 있다면 열거 형의 이름을 변경하지 않도록 할 수 있습니다 :

public class A 
{ 
    public int Id { get; set; } 

    public int PAsInt { get; set; } 

    [NotMapped] 
    public E P { 
     get { return (E) PAsInt; } 
     set { PAsInt = (int) value; } 
    } 

    public enum E { } 
} 

는 EF didn를 할 때 다시 요구 한 기존의 접근 방식이었다 ' 열거 형을 전혀 지원하지 않습니다. 불행히도이 접근법은 모델이 P 속성에 대해 알지 못하기 때문에 context.As.Where(a => a.P == E.C) 쿼리가 작동하지 않음을 의미합니다. context.As.Where(a => a.PAsInt == (int)E.C)으로 작성해야합니다. 귀하의 필요에 따라서는 충분할 수도 있습니다.

+0

답변 해 주셔서 감사합니다. 당신 말이 맞아요, 제 모델에 그 속성 (열거 형)이 있습니다. 나는 또한 이것을 반영하기 위해 질문을 업데이트했다. 불행히도 나는 그 속성들을 매핑 할 필요가있다. 그것들은 DB에 저장 될 필요가있다. 지금까지 볼 수있는 유일한 해결책은 열거 형에 다른 이름을 지정하는 것입니다. 다른 옵션이 있습니까? –

+0

+1 나는'DbModelBuilder'의 사용법에 대해 몰랐습니다. 데모 용으로 좋습니다! –

+0

@Jk_xp 저기, 그리고 내 대답을 업데이 트했습니다. 때로는 좋은 선택이 될 수 있으며 때로는 나쁜 선택이 될 수 있으므로 귀하가 받아 들일 수 있는지 여부를 판단 할 수 없습니다. – hvd