【问题标题】:Add data annotations to members in derived class为派生类中的成员添加数据注释
【发布时间】:2012-12-04 20:50:29
【问题描述】:

我有一个由多个项目组成的解决方案。其中一个项目是 POCO 对象的容器,在所有其他项目之间共享。因为对象需要与 Windows Phone、Silverlight、Windows 应用程序等兼容,所以它被创建为一个共享库,只有一部分引用。

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

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

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

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    您是否尝试过使用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)
             ...
          ;
       }
    }
    

    【讨论】:

    • 这是行不通的,因为反之亦然。这种方法需要您在 POCO 本身上声明 MetadataType,指向保存元数据的另一个类。我需要在引用 POCO 的不同项目中扩展该类,而不是相反。
    • @Jasper:似乎将MetadataType 属性添加到派生类应该 工作,但不幸的是,至少在.NET 4.0 中,它没有。将属性添加到基类确实有效,所以这可能是一个错误。看来您唯一的选择是使用流畅的配置 API。
    • 你好,理查德,我的观点仍然成立;我无法在 POCO 上指定任何属性,因为它们需要指向定义元数据的类,该类将位于另一个项目中。依赖关系是相反的;带有元数据的项目取决于持有 POCO 的项目。
    • 我会研究 fluent config API,以前没见过。谢谢。
    • 迟到的回复,但在这里!我使用 Fluent API 实现了它,效果很好。我现在有一个单独的项目,其中只有 POCO,它引用了 .NET 便携式子集(即适用于所有设备)。在数据层项目中,我引用了共享项目并使用 Fluent API 添加实体配置,如主键、必填字段等。效果很好!
    猜你喜欢
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2013-02-05
    相关资源
    最近更新 更多