Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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
C# EF Core 5.0.4-从Core 3.1升级后,通过Include()进行即时加载不起作用_C#_Entity Framework_Entity Framework Core_Ef Core 5.0 - Fatal编程技术网

C# EF Core 5.0.4-从Core 3.1升级后,通过Include()进行即时加载不起作用

C# EF Core 5.0.4-从Core 3.1升级后,通过Include()进行即时加载不起作用,c#,entity-framework,entity-framework-core,ef-core-5.0,C#,Entity Framework,Entity Framework Core,Ef Core 5.0,我们最近从3.1迁移到了.NETCore5.0.4,EF-eager加载已经停止运行。它不再加载从属对象 我们尝试像这样加载依赖实体(但未加载相关权限obj): 虽然已填充PermissionId Fk,但从属实体不是: 除了迁移到EF Core 5之外,没有其他变化 POCO,以防有帮助: public class GuardianModel : PersonModel { public int PermissionsId { get; set; } [ForeignKey(

我们最近从3.1迁移到了.NETCore5.0.4,EF-eager加载已经停止运行。它不再加载从属对象

我们尝试像这样加载依赖实体(但未加载相关权限obj):

虽然已填充PermissionId Fk,但从属实体不是:

除了迁移到EF Core 5之外,没有其他变化

POCO,以防有帮助:

public class GuardianModel : PersonModel
{
    public int PermissionsId { get; set; }
    [ForeignKey("PermissionsId")]
    public virtual GuardianPermission Permissions { get; set; }

    public GuardianModel() : base()
    {
        Permissions = new GuardianPermission();
        Active = true;
    }
}
public class GuardianPermission
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public bool MessageAsEmail { get; set; }
    public bool Permission { get; set; }
    public bool Message { get; set; }
    public bool CovidReportEmail { get; set; }
    public bool PermissionEmails { get; set; }
    public bool System { get; set; }
    public GuardianPermission()
    {
        MessageAsEmail = true;
        Permission = true;
        Message = true;
        PermissionEmails = true;
    }
}
我尝试了谷歌返回的每个答案,添加了明确的FK引用,FK不再为空,删除了虚拟关键字,没有任何区别


非常感谢您提供任何指导/故障排除步骤。

根据@apopalype的建议,它与根据以下内容中断更改有关:

非空引用导航不会被查询覆盖 跟踪问题#2693

旧行为 在EF Core 3.1中,急于初始化为非空值的引用导航有时会被数据库中的实体实例覆盖,而不管键值是否匹配。然而,在其他情况下,EF Core 3.1会做相反的事情,并保留现有的非空值

新行为 从EF Core 5.0开始,非空引用导航永远不会被查询返回的实例覆盖

请注意,仍然支持将集合导航快速初始化为空集合

为什么 将引用导航属性初始化为“空”实体实例会导致不明确的状态。例如:

C#

通常,对博客和作者的查询将首先创建博客实例,然后根据数据库返回的数据设置适当的作者实例。但是,在本例中,每个Blog.Author属性都已初始化为空作者。除了EF核心没有办法知道这个实例是“空的”。因此,覆盖这个实例可能会悄悄地丢弃一个有效的作者。因此,EF Core 5.0现在始终不会覆盖已初始化的导航

在大多数情况下,这种新的行为也与EF6的行为一致,尽管经过调查,我们也发现EF6中存在一些不一致的情况

减轻 如果遇到此中断,则修复方法是停止急切地初始化引用导航属性

就我而言:

  public GuardianModel() : base()
{
    Permissions = **new GuardianPermission();**
    Active = true;
}
冒犯的一行用黑体标出。我的解决方案是删除默认初始化,并确保在实例化主类之后实例化依赖类。有更好的办法吗。即:

var g = new GuardianModel();
g.Permissions = new GuardianPermission();

必须有一种更好的方法,而不是必须找到上述所有实例。

根据@apocalype的建议,它与根据以下内容中断更改有关:

非空引用导航不会被查询覆盖 跟踪问题#2693

旧行为 在EF Core 3.1中,急于初始化为非空值的引用导航有时会被数据库中的实体实例覆盖,而不管键值是否匹配。然而,在其他情况下,EF Core 3.1会做相反的事情,并保留现有的非空值

新行为 从EF Core 5.0开始,非空引用导航永远不会被查询返回的实例覆盖

请注意,仍然支持将集合导航快速初始化为空集合

为什么 将引用导航属性初始化为“空”实体实例会导致不明确的状态。例如:

C#

通常,对博客和作者的查询将首先创建博客实例,然后根据数据库返回的数据设置适当的作者实例。但是,在本例中,每个Blog.Author属性都已初始化为空作者。除了EF核心没有办法知道这个实例是“空的”。因此,覆盖这个实例可能会悄悄地丢弃一个有效的作者。因此,EF Core 5.0现在始终不会覆盖已初始化的导航

在大多数情况下,这种新的行为也与EF6的行为一致,尽管经过调查,我们也发现EF6中存在一些不一致的情况

减轻 如果遇到此中断,则修复方法是停止急切地初始化引用导航属性

就我而言:

  public GuardianModel() : base()
{
    Permissions = **new GuardianPermission();**
    Active = true;
}
冒犯的一行用黑体标出。我的解决方案是删除默认初始化,并确保在实例化主类之后实例化依赖类。有更好的办法吗。即:

var g = new GuardianModel();
g.Permissions = new GuardianPermission();

一定有比查找上述所有实例更好的方法。

好的,所以我将我的评论作为答案发布:

打破EF Core 5.0的变化 “非空引用导航不会被查询覆盖”

也就是说,如果导航属性为空-它将不由EF填充 (空集合除外)

从文档:

旧行为
在EF Core 3.1中,急于初始化为非空值的引用导航有时会被数据库中的实体实例覆盖,而不管键值是否匹配。然而,在其他情况下,EF Core 3.1会做相反的事情,并保留现有的非空值

新行为
从EF Core 5.0开始,非空引用导航永远不会被查询返回的实例覆盖


请注意,仍然支持将集合导航快速初始化为空集合。

好的,因此我将我的评论作为回答:

打破EF Core 5.0的变化 “非空引用导航不会被查询覆盖”

也就是说,如果导航属性为空-它将不由EF填充 (空集合除外)

从文档:

旧行为
英孚核心