4

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

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

通常我可以这样做:

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

但自然这不适用于未跟踪的实体,因为它们是未跟踪的。我感觉答案是“否”,但是有没有办法确定导航属性是否已加载到未跟踪的实体上(而不诉诸任何混乱的东西,例如对动态代理的反射)?

谢谢!

4

1 回答 1

1

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

如何使用本地?所以假设你有

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);

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

于 2013-04-24T15:36:52.847 回答