EF5代码优先:IsLoaded和. asnotracking()

本文关键字:asnotracking IsLoaded 代码 EF5 | 更新日期: 2023-09-27 18:10:38

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

我很好奇,虽然:我有很多导航属性,有时知道它们是否已经加载,或者在源查询上跟随.Include(),或者由于属性被访问(如果配置为延迟加载),这将是有用的。

通常我可以这样做:

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

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

谢谢!

EF5代码优先:IsLoaded和. asnotracking()

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

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

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