我有一个 EF5 Code First 项目,它从一个主要是只读的数据库中提取,所以我在绝大多数查询中使用 .AsNoTracking() 来提高性能。

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

通常我可以这样做:

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

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

谢谢!

最佳答案

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

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

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/

10-13 03:11