虚拟财产的属性未通过反映显示

时间:2015-08-05 19:27:41

标签: c# entity-framework reflection

我有一个带有属性的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);
}

当属性为虚拟时,我无法通过反射找到属性。如果删除虚拟关键字,则会找到属性。

我对这种行为感到很困惑。为什么不能在虚拟属性上应用属性?

1 个答案:

答案 0 :(得分:2)

我不确切地知道你想要做什么,但是根据我从EntityFramework所知道的,问题并不完全是你在想什么。您可以将属性应用于虚拟属性,并且可以通过反射恢复它们而不会出现任何问题,只需按照您的方式进行。

但是在EF实体上,当您将属性标记为虚拟时,您正在向EF定义该属性是导航属性(用于访问关系中的外键数据的属性,以及将其检索为子实体)。

然后,当您在运行时从数据库上下文获取此实体的新实例并访问该属性时,EF将创建一个从您的类派生的新类(动态代理),并使用它而不是您的原始类。实体框架是为了维护&#34;延迟加载&#34;的概念。您的关系 - 避免在不需要的情况下加载整个新的依赖实体树。

因为EF会从您的实体派生一个新类,并且该属性被覆盖,所以您的属性不会被它继承。

您可以在this post上看到有关虚拟标记和导航属性的更多信息。