1

특정 속성이있는 모델이 있습니다. MetadataType과 분리 된 클래스를 사용하여 속성 요구 사항을 정의합니다. 또한 속성의 하위 집합을 정의하는 뷰 모델을 사용하여 동일한 메타 데이터 클래스를 사용하려고합니다. 이 설명에 대한 상황의 간단한 예제 코드입니다 :메타 모델을 viewmodel과 함께 사용할 때 InvalidOperationException이 발생합니다.

[MetadataType(typeof(Metadata))] 
class ModelA 
{ 

    public class Metadata 
    { 
     [Required] 
     public object Property1 { get; set; } 

     [Required] 
     public object Property2 { get; set; } 

    } 

    public int Property1 { get; set; } 
    public int Property2 { get; set; } 
} 

[MetadataType(typeof(ModelA.Metadata))] 
class ViewModelA 
{ 
    public int Property1 { get; set; } 
} 

면도칼 엔진이보기를 처리 할 때 문제는 다음과 같은 오류 메시지와 함께 InvalidOperationException이을 던져입니다 :

'ViewModelA'형식의 연결된 메타 데이터 형식은 다음 알 수없는 속성이나 필드를 포함합니다. 속성 2. 이 멤버의 이름이 기본 유형의 속성 이름과 일치하는지 확인하십시오.

여기 내 문제는 메타 데이터가보기 모델에없는 속성을 포함한다는 것입니다. 그러나이 방법을 사용하면 메타 데이터 클래스가 갖는 이점을 실제로 이해하지 못합니다. 그래서 내 질문은

1)이 예외가 발생하는 것을 방지 할 수있는 방법이 있습니까?

2) 그렇지 않은 경우이 상황에 가장 적합한 패턴은 무엇입니까? (DRY 접근 방식을 유지함으로써 데이터 주석을 정의하면서 모델의 속성 하위 집합을 포함하는 뷰 모델 인 모델 사용).

답변

2

MetadataTypeAttribute는 일반적으로 자동 생성 된 개체에 메타 데이터를 적용하려는 경우에 사용됩니다. 메타 데이터를 객체 자체에 적용하려는 경우 객체를 다시 생성 할 때 메타 데이터를 덮어 씁니다.

이것은 일반적으로 부분 클래스를 통해 수행됩니다. 예를 들면 아래를보십시오. 이 경우 자동 생성 클래스와 동일한 이름의 빈 부분 클래스를 만듭니다. 이름은 동일하지만 MetadataType 특성을 추가하고 그 안에 중첩 된 Metadata 클래스를 포함합니다.

다른 클래스가 동일한 속성 (또는 수퍼 세트)을 가져야하므로 일반적으로 다른 클래스와 함께 사용하지 마십시오.

// Do no edit this class as it is auto generated 
public partial class ModelA 
{ 
    public int Property1 { get; set; } 
    public int Property2 { get; set; } 
} 

// This class can be edited 
[MetadataType(typeof(ModelA.Metadata))] 
public partial class ModelA 
{ 
    public class Metadata 
    { 
     [Required] 
     public object Property1 { get; set; } 

     [Required] 
     public object Property2 { get; set; } 

    } 
} 

따라서, 귀하의 질문에 대답 :

1) 아니, 당신은 예외를 막을 수 없다, 메타 데이터는 부모 클래스, 그리고 이러한 속성이 할 경우하지의 모든 속성을 설명하기 때문에 존재한다면, 그것은 버린다.

2) 대체 메타 데이터 클래스를 만들어야합니다. 독립 실행 형 뷰 모델을 만드는 것만큼이나 많은 작업이기 때문에 하위 클래스 인 뷰 모델에 대해 버디 클래스를 사용하는 것이 실제로 이점이 아닙니다.

많은 사람들이 DRY 개념에 빠져 들었습니다. 문제는 모든 소프트웨어 구현에 경쟁 요구 사항이 있다는 것입니다. DRY는 종종 Single Responsibility Principle과 확연히 구분됩니다.

MetadataTypeAttribute는 실제로 디자이너가 코드를 생성하는 방식을 처리하는 해킹 일뿐입니다. Code First를 사용한다면 MetadataTypeAttribute를 사용하지 않는 것이 좋습니다.

+0

답장을 보내 주셔서 감사합니다. 따라서 MetadataType은 데이터베이스의 첫 번째 엔티티 프레임 워크와 같이 자동 생성 클래스를 위해 설계되었습니다. 그러나 먼저 코드를 사용하기 때문에 이런 종류의 솔루션은 나에게 쓸모없는 것처럼 보입니다.사실 MVC 튜토리얼 (http://www.microsoftvirtualacademy.com/training-courses/developing-asp-net-mvc-4-web-applications-jump-start)에서이 기술을 보았 기 때문에 약간 혼란 스럽습니다.) 그래서 나는 그들이 왜 그것을 언급했는지 모른다. 아마 비디오를 검토 할 것입니다. – kexx

+0

나는 대체 메타 데이터 클래스를 만들어서 무엇을 의미하는지 알지 못하기 때문에 질문을 열어 둔다. 내 목표는 여기에 데이터 주석과 유효성 검사 자동 매칭을 사용하는 것입니다. 제약 조건 만 정의하는 동안, 나는 여전히 이것을위한 좋은 해결책을 찾고 있습니다. – kexx

+0

@kexx - Property1만으로 대체 메타 데이터 클래스를 정의하십시오. 내가 말했듯이, 자체 데이터 속성을 가진 독립형 뷰 모델을 갖는 것만 큼 많은 작업이 필요합니다. 자습서까지는 데이터베이스를 먼저 사용하거나 모델을 먼저 사용했습니다. –