2

현재 약 10 년 정도 된 레거시 데이터베이스와 Entity Framework 응용 프로그램을 통합하려고 시도하고 있습니다. 이 데이터베이스가 가지고있는 많은 문제들 중 하나는 (관계 나 제약이 전혀없는 상태에서) 거의 모든 경우에 널 (null)로 설정된다는 것입니다.nullable 값을 Entity Framework의 nullable 값으로 투명하게 변환합니다.

변함없이, 나는이 라인을 따라 예외가 발생합니다 :

'데 MyRecord'의 'SORTORDER'속성

은 '널 (null)'값으로 설정 할 수 없습니다. 이 속성을 'Int32'유형의 null이 아닌 값으로 설정해야합니다.

위의 예외를 참조하는 많은 질문을 보았지만 개발자가 데이터베이스의 데이터를 적절하게 나타내는 클래스를 작성하지 않은 것은 모두 실수로 보입니다. 데이터베이스의 데이터를 제대로 나타내지 않는 클래스를 의도적으로 작성하고 싶습니다. 나는 이것이 Entity Framework의 규칙에 위배된다는 것을 충분히 알고 있으며, 그 이유는 아마도 내가 그렇게 많은 어려움을 겪고있는 이유 일 것입니다.

기존 응용 프로그램을 손상시킬 수 있으므로이 시점에서 스키마를 변경할 수 없습니다. 이전 응용 프로그램에서 새 데이터를 삽입하기 때문에 데이터를 수정할 수도 없습니다. 엔티티 프레임 워크를 사용하여 데이터베이스를 매핑하고 싶습니다. 앞으로 몇 년 동안 모든 응용 프로그램을 천천히 이동하거나 데이터 액세스를 위해 데이터베이스에 의존하여 데이터베이스 재 설계 단계로 이동할 수 있습니다. 이 방법으로 internal 키워드를 사용

entity.Ignore(model => model.SortOrder); 
entity.Property(model => model.SortOrderInternal).HasColumnName("SortOrder"); 

:

internal int? SortOrderInternal { get; set; } 

public int SortOrder 
{ 
    get { return this.SortOrderInternal ?? 0; } 
    set { this.SortOrderInternal = value; } 
} 

내가 다음 CodeFirst의 필드를 매핑 할 수 있습니다 : 나는이 문제를 가져 오는 데 사용했다

한 가지 방법에 변수 투명 프록시 이 멋쟁이를 훌륭하게 캡슐화 할 수있게 해 주므로 적어도 데이터 액세스 어셈블리 외부로 유출되지 않도록 할 수 있습니다. NotSupportedException가 발생 될 것이다

그러나 불행하게도 지금은 쿼리에서 프록시 필드를 사용하여 드릴 수 없습니다 :

지정된 유형의 멤버 'SORTORDER'엔티티에 LINQ에서 지원되지 않습니다. 이니셜 라이저, 엔티티 구성원 및 엔티티 탐색 특성 만 지원됩니다.

아마도 DbSet에 의해 수신 된 표현식을 투명하게 다시 쓸 수 있습니까? 이것이 효과가 있는지 듣고 싶습니다. 나는 말할 수있는 나무로 숙련 된 사람이 아닙니다. 지금까지 DbSet에서 표현식을 조작하기 위해 재정의 (override) 할 수있는 메소드를 찾는데 실패했지만, IDbSet을 구현하고 DbSet으로 전달되는 새로운 클래스를 작성하는 것보다 끔찍한 일입니다.

스택 추적을 조사하는 동안 Shaper라고하는 내부 Entity Framework 개념에 대한 참조가 발견되었습니다.이 개념은 데이터를 가져 와서이 개념에 대한 인터넷 검색을 빠르게 수행합니다. 아무것도,하지만 dotPeek 함께 System.Data.Entity.dll 조사 확실히이 뭔가 도움이 될 것이라고 나타냅니다 ... 가정 Shaper<T> 내부 및 봉인 않았습니다. 나는 틀린 나무를 거의 확실하게 여기에서 짖고있다. 그러나 누군가가 이것을 전에 만났던 지에 관해 듣는 것은 흥미있을 것이다.

+0

nullable 속성으로 작업하고 싶지 않은 이유가 있습니까? 데이터베이스 스키마를 제한하고 코드를 적절하게 작성하기보다는 데이터베이스 스키마와 "싸우"려고하는 것처럼 느껴집니다. –

+0

관심의 대상에서 왜 CSDL/모델 속성에서 엔티티 속성을 null = false로 설정하지 않았습니까? 기본 SSDL은 null 가능하지만 null이 아닌 값은 올바르게 매핑되지만 DB에 null이 있으면 ConstraintException (yyy의 XXX 속성을 null 속성으로 설정할 수 없음)을 처리해야합니다. – StuartLC

+0

@ AndrewStephens 데이터베이스를 설계하는 방법이 아니기 때문에이 작업을 수행하고 싶지 않습니다. 예를 들어, Entity Framework를 사용하여 해결 한 동일한 테이블에 두 개의 개별 엔터티가 저장되는 상황도 있습니다. 응용 프로그램 계층에서 데이터를 다시 해석하고 나중에 가능할 때 데이터베이스를 수정하고 싶습니다. Entity Framework 레이어의 클래스에서 nullable 값을 허용하면 (실제로는 거의 모든 필드, 심지어 외래 키),이 문제를 실제로 해결하지는 못합니다. –

답변