【问题标题】:How to check if property is already lazy loaded?如何检查属性是否已经延迟加载?
【发布时间】:2022-02-08 20:56:44
【问题描述】:

我有一个使用 EF Core 创建的模型(代码优先),我的一个属性尝试访问延迟加载的代理,如下所示:

public class T012_Pedido
{
    private string _t012NumeroPedido;
    private ObservableCollection<T012_Pedido_Item> _t012PedidoItem = new();

    [Required]
    [Column(TypeName = "varchar")]
    [MaxLength(16)]
    public string T012_NumeroPedido
    {
        get => this._t012NumeroPedido;

        set
        {
            if (value == this._t012NumeroPedido)
            {
                return;
            }

            this._t012NumeroPedido = value;
            this.OnPropertyChanged();
        }
    }

    [BackingField(nameof(_t012PedidoItem))]
    public ObservableCollection<T012_Pedido_Item> T012_Pedido_Item
    {
        get => this.LazyLoader.Load(this, ref this._t012PedidoItem);
        set => this._t012PedidoItem = value;
    }
}

public class T012_Pedido_Item
{
[Required]
[BackingField(nameof(_t012Pedido))]
public virtual T012_Pedido T012_Pedido
{
    get => this.LazyLoader.Load(this, ref this._t012Pedido);

    set
    {
        if (this._t012Pedido == value)
        {
            return;
        }

        this._t012Pedido = value;
        this.OnPropertyChanged();
    }
}

public decimal T012_PesoLiquido
{
    get => this._t012PesoLiquido;

    set
    {
        this._t012PesoLiquido = value;
        this.OnPropertyChanged();
    }
}
}

如果我尝试访问 T012_Pedido_Item 类的属性 T012_PesoLiquido 中的属性 T012_Pedido,我会收到以下错误:

System.InvalidOperationException:为警告“Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadingWarning”生成错误:尝试在“T012_Pedido_Item”类型的分离实体上延迟加载导航“T012_Pedido”。分离实体或使用“AsNoTracking”加载的实体不支持延迟加载。可以通过将事件 ID 'CoreEventId.DetachedLazyLoadingWarning' 传递给 'DbContext.OnConfiguring' 或 'A' 中的 'ConfigureWarnings' 方法来抑制或记录此异常 ddDbContext'。

如果我没有任何代码访问模型内​​的属性,并尝试在其他代码块中访问,一切正常。 我认为当我尝试访问属性 T012_PesoLiquido 内部时,延迟加载尚未准备好,这就是我收到错误的原因。 我想知道在这种情况下该怎么做。

提前致谢。

编辑:

我发现如果我尝试访问字段而不是属性,则不会发生错误并且我能够访问所有数据。

【问题讨论】:

    标签: c# entity-framework-core ef-core-6.0


    【解决方案1】:

    每当您显式或隐式尝试延迟加载与其关联的 DbContext 范围之外的实体时,都会发生该错误。 “检查它是否延迟加载”实际上只是关闭延迟加载,从某种意义上说,您将获得实体(如果它在离开 DbContext 范围之前已加载),或者您将获得 #null .

    基本上,如果您这样做:“可以通过将事件 ID 'CoreEventId.DetachedLazyLoadingWarning' 传递给 'DbContext.OnConfiguring' 或 'A ddDbContext' 中的 'ConfigureWarnings' 方法来抑制或记录此异常。”在 DbContext 配置中,如果无法完成延迟加载,它应该返回 #null 而不是抛出该异常。

    如果您要使用延迟加载,请务必确保在 DbContext 范围内始终可以访问实体。读取它的 DbContext 或者已从该上下文中分离并附加到一个新的 DbContext 实例,它可以调用该实例来执行任何可能的延迟加载。

    【讨论】:

    • 您好史蒂夫,感谢您的回答。我认为这不是我遇到的问题,除非 EF 自行分离我的实体,因为所有内容都在相同的方法和相同的上下文中运行。 var t012List = unitOfWork.T012_Repository.GetAll(); var t012 = t012List.FirstOrDefault()?.T012_Pedido_Item.Count(); // 这里发生错误 Console.WriteLine($"Encontrados {t012List.Count()} pedidos");
    • 实际上,我刚刚发现如果我在查询中调用 ToList() 就会发生错误。
    猜你喜欢
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2019-05-25
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多