向Entity Framework模型添加属性嵌套类属性

时间:2014-03-17 19:48:11

标签: c# entity-framework

我一直在寻找一种向我的实体类属性添加属性的方法,而我发现达到该属性的唯一方法就像在此示例中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; }
    }
}

代码I用于反思:

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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; 
  }
}

虽然......我不确定为什么你的部分不是Generated不仅仅是:

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

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

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