gpt4 book ai didi

c# - EF5 代码优先 : IsLoaded and . AsNoTracking()

转载 作者:行者123 更新时间:2023-11-30 12:47:41 24 4
gpt4 key购买 nike

我有一个从大部分只读数据库中提取的 EF5 Code First 项目,因此我对绝大多数查询使用 .AsNoTracking() 以提高性能。

不过我很好奇:我有许多导航属性,有时了解它们是否已经加载会很有用,可以在 .Include() 之后源查询,或由于正在访问的属性(如果配置为延迟加载)。

通常我可以这样做:

context.Entry(myEntity).Reference(e => e.MyNavigationProperty).IsLoaded;

但这自然不适用于未跟踪的实体,因为它们是未跟踪的。我感觉答案是否定的,但是有没有一种方法可以确定导航属性是否已加载到未跟踪的实体上(无需借助动态代理上的反射等任何困惑的方式)?

谢谢!

最佳答案

下面的解决方案不适用于通过访问未跟踪实体从数据库加载的实体。尽管对该导航属性的后续引用不会创建数据库命中,但 Entity Framework 不会跟踪导航属性。我将此作为如何不这样做的示例;)

使用 Local 怎么样?所以假设你有

public class MyEntity
{
public int MyEntityId { get; set;}
public int MyNavigationPropertyID { get; set;}
public MNP MyNavigationProperty { get; set; }
}

public class MNP
{
public int MNPID { get; set;}
}

你可以这样做:

context.MyNavigationProperties.Local.Where(e => e.MNPID == MyNavigationProperty);

本地存储当前正在跟踪且未标记为已删除的实体。我还没有测试过,但它应该可以工作。

关于c# - EF5 代码优先 : IsLoaded and . AsNoTracking(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16195300/

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