2016-12-15 1 views
1

오늘 나는 EF6 내장 규칙에 대해 더 많은 문제가 있었을 것입니다. 디버깅을 통해 코드 첫 번째 EF6에서 모든 기본 규칙을 사용할 수 있음을 알았습니다.EF6의 모든 규칙을 비활성화하십시오.

mapper 클래스를 사용하여 잘 생긴 모델 매핑을 생성했기 때문에 컨벤션을 사용하여 데이터 모델을 변경하는 것이 바람직하지 않습니다. 구체적인에서

, 나는 때문에 FK 열이 제대로 linkedentity로 매핑되고 난에 다른 이름을 사용하는 이유가없는 SQL, 들어간 가짜 열 Extent1.LinkedEntity_id의 간단한 SELECT 쿼리를 실행할 수 없습니다 내 데이터 베이스.

명료성 :이 코드 우선 모델은 DB 처음부터 리버스 엔지니어링됩니다. 데이터베이스 규칙과 나는 그것의 디자인을 변경할 수 없습니다.

질문 : 모든 규칙을 한 번에 어떻게 비활성화 할 수 있습니까? .Clear 방법을 찾지 못했습니다. DbModelBuilder.Conventions

+0

DB가 있고 변경할 수없는 경우 왜 코드 우선을 사용합니까? 처음에는 저에게 데이터베이스와 같은 것으로 보입니다. – Sefe

+0

긴 이야기입니다. 기본적으로 우리는 프로젝트가 아닌 ** 제품 **을 유지합니다. 단일 DB는 없습니다. 응용 프로그램이 설치된 각 고객 사이트에서 DB를 배포, 유지 관리 및 마이그레이션해야합니다. 실제로, 2 개의 다른 EF 유틸리티 라이브러리를 사용하여 대량 삽입 오류로 시작한 긴 이야기입니다. –

+0

실제로 EDMX 모델을 코드로 이식하기 전에는이 문제가 없었습니다 –

답변

1

본래의 제거 방법이 없습니다. 그러나 리플렉션을 사용하여 수행 할 수 있습니다. 모든 협약을 찾아 제거하십시오. 이 같은 뭔가 도움이 될 것입니다

private void RemoveAllConventions(DbModelBuilder modelBuilder) 
    { 

     var conventions = AppDomain.CurrentDomain.GetAssemblies() 
      .SelectMany(a => a.GetTypes().Where(t => t.IsClass && t.GetInterface("IConvention") != null)); 


     var remove = typeof(ConventionsConfiguration).GetMethods().Where(m => m.Name == "Remove" && m.ContainsGenericParameters).First(); 
     foreach (var item in conventions) 
     { 
      try 
      { 
       remove.MakeGenericMethod(item).Invoke(modelBuilder.Conventions, null); 
      } 
      catch (Exception) 
      { 
      } 
     } 
    } 

그리고 당신의 OnModelCreating에 :

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     RemoveAllConventions(modelBuilder); 
    } 

이 개념을 더 반복하고 결과를 다시보고 주시기 바랍니다.

+0

안녕하세요, 이것은 내 질문에 대한 올바른 해결책이었습니다 (비록 약간의 조정이 필요했지만). 그러나 어쨌든 토론을 위해 루트 문제를 해결하지 못했습니다. 언젠가는 EF7로 업그레이드 할 생각이지만 다시 작성해야합니다. –

관련 문제