Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 从数据库加载时映射属性的顺序_Entity Framework_C# 4.0_Mapping_Instantiation_Setter - Fatal编程技术网

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
for
Important
将是一种无效状态,并且总是会导致异常,不管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
for
Important
将是一种无效状态,并且总是会导致异常,不管setter调用的顺序如何。它在同一个表中,但我不明白为什么总是会出现异常。只有当DependsOnImportant被设置为true时,才会出现异常。否则我们有value=false,Important=false,value&!重要=>错误。我错过什么了吗?