2012-11-30 48 views
0

我有一个由多个项目组成的解决方案。其中一个项目是POCO对象的容器,在所有其他项目之间共享。由于这些对象需要与Windows Phone,Silverlight,Windows Apps等兼容,因此它仅作为共享库创建,仅包含一部分引用。向派生类中的成员添加数据注释

我想重新使用这些对象作为数据库模型的代码优先实现,这需要我向成员添加数据注释属性。但是数据标注名称空间不包含在参考子集中。

所以我想我会在我的服务API项目中创建派生类,以在其中添加数据注释。但我不太确定如何做到这一点,或者甚至可以做到。

所以我正在寻找一些想法,也许最佳实践。当然,我可以创建新模型并使用映射技术从一个数据中获取数据,但当它们完全相同时,这听起来有点愚蠢。

回答

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。 –