gpt4 book ai didi

c# - 新实体的 EF Core 延迟加载器行为

转载 作者:行者123 更新时间:2023-12-05 01:54:47 30 4
gpt4 key购买 nike

lazy loading without proxies 上的 EF Core 文档引用这个例子:

public class Blog
{
private ICollection<Post> _posts;

public Blog()
{
}

private Blog(ILazyLoader lazyLoader)
{
LazyLoader = lazyLoader;
}

private ILazyLoader LazyLoader { get; set; }

public int Id { get; set; }
public string Name { get; set; }

public ICollection<Post> Posts
{
get => LazyLoader.Load(this, ref _posts);
set => _posts = value;
}
}

所以我们有一个无参数构造函数和一个惰性加载器注入(inject)构造函数。然后文档是这样说的:

This method doesn't require entity types to be inherited from ornavigation properties to be virtual, and allows entity instancescreated with new to lazy-load once attached to a context.

那么这对新实例到底意味着什么?由 EF 核心创建的实体将注入(inject)延迟加载程序,但 new 实体不会。这是否意味着一旦将新项目添加到上下文中,惰性加载程序支持字段就应该更新?

最佳答案

当涉及私有(private)构造函数和 setter 时,EF 在某种程度上打破了封装规则。这不是一件坏事,因为将这些私有(private)化的真正目标是确保组织对代码的访问,而无需猜测使用哪个和使用什么,但同时 EF 将通过反射忽略这些限制。

当您附加一个实体到DbContext时,DbContext 将检查附加的实体是否可以注入(inject)属性类型。这包括 ILazyLoader,EF 将使用私有(private) setter 进行连接。因此,您可以新建一个新实体,一旦附加到 DbContext,它就可以访问延迟加载程序。

关于c# - 新实体的 EF Core 延迟加载器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70544403/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com