C# EF Core 5.0.4-从Core 3.1升级后,通过Include()进行即时加载不起作用
我们最近从3.1迁移到了.NETCore5.0.4,EF-eager加载已经停止运行。它不再加载从属对象 我们尝试像这样加载依赖实体(但未加载相关权限obj): 虽然已填充PermissionId Fk,但从属实体不是: 除了迁移到EF Core 5之外,没有其他变化 POCO,以防有帮助: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(
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填充 (空集合除外) 从文档: 旧行为
英孚核心