2012-09-18 3 views
0

내가 맵 파일 (1 - 투 - 많은 장치와 기계 사이의 관계)에 다음 정의한 경우 :EF 4.1 CodeFirst의 GetValidationErrors

this.HasRequired(t => t.Unit) 
    .WithMany(t => t.Machines) 
    .HasForeignKey(d => d.UnitId); 

나는 새 개체를 추가 할 때 Machine.UnitOfMeasurement = NULL, SP 않는 이유 DbContext는 GetValidationErrors를 호출 할 때 검증 문제를 반환하지 않으며이를 탐지하기 위해 무엇을 할 수 있습니까? EF가 업데이트를 시도하도록 허용하면 DbEntityValidationResult (유효성 검사 오류를 발행 한 속성 이름)에서 사용자에게 의미있는 정보를 추출 할 수있는 반면 외래 키 참조 오류와 같이 사용자에게 의미없는 메시지가 반환됩니다.

속성이 아닌 유효성 검사 규칙에 IDataErrorInfo를 사용하고 있습니다.

답변

1

EF 유효성 검사는 탐색 속성의 유효성을 검사하지 않습니다. 그 이유는 관련 엔티티가 존재하지 않기 때문에가 아니라 지연로드가 활성화되고 관련 엔티티가로드되지 않았기 때문에 네비게이션 특성이 null이 될 수 있기 때문입니다. 또한 탐색 속성이 null 인 경우에도 기본적으로 관계가 있지만 탐색 속성이 아직 업데이트되지 않았 음을 의미하는 해당 외래 키 속성을 설정했을 수 있습니다. 또한로드 관련 엔티티를 강제 실행하면 유효성 검사가 전체 데이터베이스를 메모리로 가져옵니다 (관련 엔티티를로드 한 후 새로로드 된 엔티티 등의 관련 엔티티를로드하는 결과를 얻게 될 것입니다) -이 일이 발생하지 않도록주의하십시오 (실제로 EF는 유효성 검사 중에 지연로드를 막아이를 방지합니다.) EF 유효성 검사는 유효성 검사 특성 및 IValidatableObject 만 IDataErrorInfo를 지원하지 않습니다.

+0

EF가 참조 속성에 값이 있는지 확인하는 것이 정상적인가요? 맵에 HasRequired를 설정 했습니까? 입력 된 값이 올바른지 여부는 신경 쓰지 않고 NULL을 허용하지 않는다는 사실을 사용자에게 알리는 데주의해야합니다. entity에 대한 Reference 및 ReferenceId가있는 상황에 대해 여기서 이야기하고 있으며 ReferenceId를 설정 한 다음이 객체가 메모리에로드되지 않은 경우 Reference가 null 일 수 있습니다. 나는 그것에 동의하지만 참조 속성에 ForeignKey ("ReferenceId")를 설정하면 Reference에 null이 포함되어 있으면 ReferenceId가 설정되어 있는지 EF 검사에서 예상하는 것이 정상적인 것은 아닌지 아닌지? – Goran

+0

1) 아니요. 탐색 속성이 null 인 경우 관련 엔티티가 없거나 (HasRequired가 설정된 경우 잘못된 경우) 또는 관련 엔티티가 아직로드되지 않았 음을 의미 할 수 있습니다. 관련 속성이 실제로 설정되었는지 확인하려면 데이터베이스를 다시 가져와야합니다. 이는 비용이 많이 들고 데이터베이스의 절반을 메모리에로드 할 수 있으므로 항상 피해야하는 상황입니다. – Pawel

+0

2) 아니요. 외부 키를 값으로 설정하는 것이 정확할 필요는 없습니다. 외래 키를 설정할 값이있는 엔티티가없는 경우에는 어떻게합니까? 또한 EF의 유효성 검사는 특성 및 패싯에만 기반한 값의 유효성을 검사합니다. 2 개 이상의 속성에 대해 교차 검사를 수행하는 특정 논리가 없습니다. EF에서 (1 및 2) 유효성 검사가 확장 가능하다고 했으므로 CustomValidationAttribute, 사용자 지정 특성 (ValidationAttribute 클래스에서 파생 된 특성) 또는 IValidatableObject를 사용하여 사용자 지정 규칙을 사용하여 기본 유효성 검사를 확장 할 수 있습니다. 그냥 일이야. – Pawel