我一直在寻找一种向我的实体类属性添加属性的方法,而我发现达到该属性的唯一方法就像在此示例中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;
}
任何帮助将不胜感激。
答案 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; }
}
由于属性的属性在编译时被合并。