2012-11-30 3 views
0

몇 가지 프로젝트로 구성된 솔루션이 있습니다. 이 프로젝트들 중 하나는 POCO 객체를위한 컨테이너이며 다른 프로젝트들과 공유됩니다. 개체는 Windows Phone, Silverlight, Windows Apps 등과 호환되어야하므로 참조의 하위 집합 만있는 공유 라이브러리로 만들어집니다.파생 클래스의 멤버에게 데이터 주석을 추가하십시오.

데이터 모델의 코드 우선 구현에이 객체를 다시 사용하려면 멤버에 데이터 주석 속성을 추가해야합니다. 그러나 데이터 주석 네임 스페이스는 참조 하위 집합에 포함되어 있지 않습니다.

그래서 내 서비스 API 프로젝트에서 데이터 주석을 추가하기 위해 파생 클래스를 만들 것이라고 생각했습니다. 그러나 나는 이것을 할 수있는 방법이나 심지어 할 수 있는지에 대해서는 잘 모른다.

그래서 몇 가지 아이디어를 찾고 있습니다. 모범 사례 일 수 있습니다. 물론 새로운 모델을 만들고 매핑 기술을 사용하여 하나에서 다른 데이터로 데이터를 가져올 수 있지만 100 % 같으면 조금 어리석은 것 같습니다.

답변

2

MetadataTypeAttribute을 사용해 보셨나요?

[MetadataType(typeof(Metadata))] 
public class DerivedEntity : PocoEntity 
{ 
    private sealed class Metadata 
    { 
     [Required, AnotherAnnotation] 
     public object NameOfPropertyToDecorate; 
    } 
} 

편집
이 작동하지 않습니다. 기본 클래스에 MetadataType 특성을 추가하면 작동합니다. 파생 클래스에 추가하면 주석이 무시됩니다. 이 동작은 버그처럼 느껴지지만 이유가있을 수 있습니다.

최상의 옵션은 the fluent API을 사용하여 엔티티를 구성하는 것입니다.

public class YourContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Configurations.Add(new PocoEntityConfiguration()); 
    } 
} 

public class PocoEntityConfiguration : EntityTypeConfiguration<PocoEntity> 
{ 
    public PocoEntityConfiguration() 
    { 
     Property(e => e.TheProperty) 
     .IsRequired() 
     .HasMaxLength(80) 
     ... 
     ; 
    } 
} 
+0

+1 : 시도하지는 않았지만 매우 울림 소리가납니다. – quetzalcoatl

+0

다른 방식으로 작동하기 때문에 작동하지 않습니다. 이 방법을 사용하면 메타 데이터를 보유하고있는 다른 클래스를 가리키는 POCO 자체에 MetadataType을 선언해야합니다. POCO를 참조하는 다른 프로젝트에서 클래스를 확장해야합니다. 다른 방법은 아닙니다. – Jasper

+0

@ Jasper : 파생 된 클래스에 'MetadataType' 속성을 추가하는 것처럼 보입니다. * 불행하게도 적어도 .NET 4.0에서는 작동하지 않습니다. 기본 클래스에 속성을 추가해도 작동하므로 버그 일 가능성이 큽니다. 유일한 옵션은 유창한 구성 API를 사용하는 것 같습니다. –

관련 문제