我有一个 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/