向实体框架模型添加属性,嵌套类属性

本文关键字:属性 嵌套 添加 实体 框架 模型 | 更新日期: 2023-09-27 17:50:50

我一直在寻找一种方法来添加属性到我的实体类属性和唯一的方法,我发现达到这是像在这个例子中添加自定义属性属性在实体框架代码

所以我把它应用到我的项目,它似乎应该工作得很好,但当我试图通过属性属性反映我得到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; 
}

向实体框架模型添加属性,嵌套类属性

您的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; }
}
属性的属性在编译时合并。