实体框架4.1 - 代码优先。 EF不会覆盖我的虚拟成员吗?

时间:2011-08-10 07:08:26

标签: c#-4.0 entity-framework-4 domain-driven-design polymorphism

我正在使用域驱动设计和EF 4.1构建系统。在我的一些属性中,我有逻辑阻止设置非法值,如果是这样,则抛出异常。我认为EF在实例化我的类时创建了一个新的临时类,例如MyClass_abc123 ...继承自MyClass,它覆盖所有虚拟成员,以便能够使用来自数据库的数据设置它们。当EF实例化下面的类并尝试设置属性MyObj时,抛出异常。任何人都有一个线索或一个很好的方法来解决它?

public class MyClass
{
    private MyObject _myObj;
    public virtual MyObject MyObj
    {
        get { return _myObj; }
        set
        {
            if (!check some logic...)
                throw new Exception();

            _myObj = value;
        }
    }
}

BR 菲利普

1 个答案:

答案 0 :(得分:3)

EF不会覆盖您的内部逻辑。 EF只包装它,包装器属性仍调用base setter和getter。

编辑:

没有任何方法可以避免这种情况。只需将一些逻辑添加到您的实体中,您就要对它负责。从数据库加载实体时也会调用setter,因为它必须设置属性。如果您不希望在从数据库加载实体时执行逻辑,则必须添加一些其他逻辑,这些逻辑将在加载对象后启用验证。要启用验证,您可以处理:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.ObjectMaterialized += YourHandler

ObjectMaterialzied处理程序中,您需要检查实体化对象的类型并将其转换为暴露TurnOn功能的类型并简单地调用它。