Entity framework 从数据库加载时映射属性的顺序
假设我有以下代码:Entity framework 从数据库加载时映射属性的顺序,entity-framework,c#-4.0,mapping,instantiation,setter,Entity Framework,C# 4.0,Mapping,Instantiation,Setter,假设我有以下代码: public bool Important { get; set; } private bool _dependsOnImportant; public bool DependsOnImportant { get; set { if (value && !Important) throw new InvalidOperationException(); _dependsOnI
public bool Important { get; set; }
private bool _dependsOnImportant;
public bool DependsOnImportant
{
get;
set
{
if (value && !Important)
throw new InvalidOperationException();
_dependsOnImportant = value;
}
}
我想保护将DependsOnImportant设置为true,这样只有在重要为true时才有可能。这是POCO课程。根据:当从数据库加载对象时,EF将使用我的setter。
调用DependensOnImportant setter时,如何确保已使用数据库中的数据设置了Important?EF是否足够聪明,能够检测到一个setter正在使用另一个setter并首先加载该数据?我不这么认为。我认为使用默认构造函数(将所有字段设置为默认值)创建一个新对象,然后调用setter来填充该对象
所以我的问题是:我们能确定二传手的顺序吗?但最重要的是:我们想拥有这些知识吗?在我看来,即使没有EF,这种二传手也是错误的。属性看起来像消费者端的普通数据字段,在您的情况下,对象的状态取决于您为属性设置值的顺序。一些开发者可能只是简单地交换设置属性值的顺序,然后应用程序的行为突然改变或不再工作。我称之为副作用。它应该是一种方法,可以使依赖于当前对象状态的逻辑明确在其中(至少setter应该是一种方法,getter仍然可以作为只读属性存在)。非常感谢您的回答,非常感谢。我当然明白你的观点,但并不完全同意。如果没有EF,实例化时的Important的默认值将设置为false(默认情况下),也可以在构造函数中显式设置为false。setter中的逻辑要点是在DependsOnImportant设置为true之前,确保将Important设置为true。如果其他开发人员更改了顺序(这是错误的),我的类将是安全的,他们将得到一个异常。但我知道这不是最巧妙的解决办法,这就是我为什么要问的原因。请参阅其他注释假设我们采用您的方法并提供显式的setter方法,那么如何保护setter?我不能将其私有化,因为EF将无法再访问它。但是我也不希望它是公共的或受保护的。数据库表中的
重要
和dependson重要
这两列吗?我很奇怪,因为这意味着数据库中的false
forImportant
将是一种无效状态,并且总是会导致异常,不管setter调用的顺序如何。它在同一个表中,但我不明白为什么总是会出现异常。只有当DependsOnImportant被设置为true时,才会出现异常。否则我们有value=false,Important=false,value&!重要=>错误。我是不是遗漏了什么?在我看来,即使没有EF,这种二传也是错误的。属性看起来像消费者端的普通数据字段,在您的情况下,对象的状态取决于您为属性设置值的顺序。一些开发者可能只是简单地交换设置属性值的顺序,然后应用程序的行为突然改变或不再工作。我称之为副作用。它应该是一种方法,可以使依赖于当前对象状态的逻辑明确在其中(至少setter应该是一种方法,getter仍然可以作为只读属性存在)。非常感谢您的回答,非常感谢。我当然明白你的观点,但并不完全同意。如果没有EF,实例化时的Important的默认值将设置为false(默认情况下),也可以在构造函数中显式设置为false。setter中的逻辑要点是在DependsOnImportant设置为true之前,确保将Important设置为true。如果其他开发人员更改了顺序(这是错误的),我的类将是安全的,他们将得到一个异常。但我知道这不是最巧妙的解决办法,这就是我为什么要问的原因。请参阅其他注释假设我们采用您的方法并提供显式的setter方法,那么如何保护setter?我不能将其私有化,因为EF将无法再访问它。但是我也不希望它是公共的或受保护的。数据库表中的重要
和dependson重要
这两列吗?我很奇怪,因为这意味着数据库中的false
forImportant
将是一种无效状态,并且总是会导致异常,不管setter调用的顺序如何。它在同一个表中,但我不明白为什么总是会出现异常。只有当DependsOnImportant被设置为true时,才会出现异常。否则我们有value=false,Important=false,value&!重要=>错误。我错过什么了吗?