我正在使用域驱动设计和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 菲利普
答案 0 :(得分:3)
EF不会覆盖您的内部逻辑。 EF只包装它,包装器属性仍调用base setter和getter。
编辑:
没有任何方法可以避免这种情况。只需将一些逻辑添加到您的实体中,您就要对它负责。从数据库加载实体时也会调用setter,因为它必须设置属性。如果您不希望在从数据库加载实体时执行逻辑,则必须添加一些其他逻辑,这些逻辑将在加载对象后启用验证。要启用验证,您可以处理:
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.ObjectMaterialized += YourHandler
在ObjectMaterialzied
处理程序中,您需要检查实体化对象的类型并将其转换为暴露TurnOn功能的类型并简单地调用它。