我有一个带有属性的EntityFramework模型,我用它来验证字段。
private person tipProvider;
[Required]
[ForeignKey("TipProviderId")]
public virtual person TipProvider
{
get { return tipProvider; }
set
{
tipProvider = value;
ValidateProperty(MethodBase.GetCurrentMethod().Name.Replace("set_", ""));
raisePropertyChanged(MethodBase.GetCurrentMethod().Name.Replace("set_", ""));
}
}
我得到PropertyInfo
,然后是它的验证属性,我用它来验证属性:
public virtual void ValidateProperty(string property)
{
errors[property].Clear();
var propertyInfo = this.GetType().GetProperty(property);
var propertyValue = propertyInfo.GetValue(this);
var validationAttributes = propertyInfo.GetCustomAttributes(true).OfType<ValidationAttribute>();
foreach (var validationAttribute in validationAttributes)
{
if (!validationAttribute.IsValid(propertyValue))
{
errors[property].Add(validationAttribute.FormatErrorMessage(string.Empty));
}
}
raiseErrorsChanged(property);
}
当属性为虚拟时,我无法通过反射找到属性。如果删除虚拟关键字,则找到该属性。
我真的被这种行为弄糊涂了。为什么不能在虚拟属性上应用属性?我不知道你到底想做什么,但从我从EntityFramework所知道的,问题并不完全是你在想什么。您可以将属性应用到虚拟属性,并且可以通过反射恢复它们而不会出现任何问题,就像您正在做的那样。
但是在EF实体上,当你将一个属性标记为虚拟属性时,你是在EF中定义该属性是一个导航属性(用于访问关系中的外键数据并将其作为子实体检索的属性)。
然后,当您在运行时从数据库上下文中获得该实体的新实例并访问该属性时,EF将创建一个从您的类派生的新类(动态代理)并使用它而不是您的原始类。实体框架这样做是为了维护"延迟加载"关系的概念——避免在不需要的情况下加载整个新的依赖实体树。
因为EF从你的实体创建了一个新的类,并且属性被它覆盖,所以你的属性不被它继承。
你可以在这篇文章中看到更多关于虚拟标记和导航属性的内容