【问题标题】:Adding attributes to Entity Framework models nested classes properties向实体框架模型嵌套类属性添加属性
【发布时间】:2014-03-17 19:48:11
【问题描述】:

我一直在寻找一种将属性添加到我的实体类属性的方法,而我发现的唯一方法就像在这个示例中一样 Adding custom property attributes in Entity Framework code

所以我将它应用到我的项目中,看起来它应该运行良好,但是当我试图通过属性属性进行反映时,我得到了 null。 我已经多次检查我的代码,但无法弄清楚为什么会发生这种情况。

我的代码示例: 在实体基础模型中:

public partial class Trainer
{
    public Trainer()
    {
        this.Subjects = new HashSet<Subject>();
    }

    public int ID { get; set; }
    public int PersonalDataID { get; set; }

    public virtual PersonalData PersonalData { get; set; }
    public virtual ICollection<Subject> Subjects { get; set; }
}

在我的部分课程中:

[MetadataType(typeof(Trainer.TrainerMetadata))]
public partial class Trainer
{
    internal class TrainerMetadata
    {
        [Search("PersonalData", true)]
        public virtual PersonalData PersonalData { get; set; }

        [Search("Subject", true)]
        public virtual ICollection<Subject> Subjects { get; set; }
    }
}

我用于反射的代码:

foreach (PropertyInfo pI in typeof(Trainer).GetProperties())
{
  //sAttr always == null
  SearchAttribute sAttr = pI.GetCustomAttributes(typeof(SearchAttribute))
    .FirstOrDefault() as SearchAttribute; 
}

我们将不胜感激。

【问题讨论】:

  • 请发布您的代码
  • 完成我已经编辑了我的帖子
  • "试图通过属性来反映我得到了 null"
  • 是的,现在它已经被编辑了

标签: c# entity-framework


【解决方案1】:

您的 SearchAttribute() 未应用于 Trainer 类,而是应用于 TrainerMetadata 类,因此您的 foreach 将不会永远找到它们。

您需要执行以下操作:

var metadata = typeof(Trainer).GetCustomAttributes(typeof(MetaDataAttribute))
  .FirstOrDefault();

if (metadata != null)
{
  var trainerMetadata = metadata.MetadataClassType;
  foreach (PropertyInfo pI in trainerMetadata.GetProperties())
  {
    var sAttr = pI.GetCustomAttributes(typeof(SearchAttribute))
      .FirstOrDefault() as SearchAttribute; 
  }
}

虽然...我不确定为什么您的未生成部分不只是看起来像:

public partial class Trainer
{
  [Search("PersonalData", true)]
  public virtual PersonalData PersonalData { get; set; }

  [Search("Subject", true)]
  public virtual ICollection<Subject> Subjects { get; set; }
}

由于属性的属性在编译时被合并。

【讨论】:

  • 因为它是特定于实体框架的。 Entity-Framework 知道,如果您应用MetaDataAttribute() 来使用它进行验证(并且可能有我在其中编写的代码来验证字段)。除非我弄错了,您的自定义 SearchAttribute() 与 Entity-Framework 无关,因此您必须实际编写代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
相关资源
最近更新 更多