【问题标题】:Entity Framework 4.1 - Code first. Doesn't EF override my virtual members?实体框架 4.1 - 代码优先。 EF 不会覆盖我的虚拟成员吗?
【发布时间】:2011-08-10 07:08:26
【问题描述】:

我正在使用领域驱动设计和 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 菲利普

【问题讨论】:

  • 我们不知道你的 setter 中执行了什么逻辑。这不是覆盖属性的问题。这是你的逻辑问题。
  • 如果我只写,跳过“逻辑”的事情: set { throw new Exception();} 它会抛出异常。但我认为 EF 会用它自己的属性覆盖该属性?

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


【解决方案1】:

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

编辑:

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

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

ObjectMaterialzied 处理程序中,您需要检查物化对象的类型并将其转换为公开您的 TurnOn 功能的类型,然后简单地调用它。

【讨论】:

  • 谢谢!我会试试的。 /菲利普
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
  • 2012-08-04
  • 2012-03-12
相关资源
最近更新 更多