实体框架中INCLUDE的奇怪行为

本文关键字:框架 INCLUDE 实体 | 更新日期: 2023-09-27 18:01:51

这行得通:

using (var dbContext = new SmartDataContext())
{
    dbContext.Configuration.ProxyCreationEnabled = false;
    var query = dbContext.EntityMasters.OfType<Person>();
    if (includeAddress)
        query.Include(p => p.Addresses);
    if (includeFiles)
        query.Include(p => p.FileMasters);
    output.Entity = query.Include(s=>s.Addresses).FirstOrDefault<Person>(e => e.EntityId == id);
}

using (var dbContext = new SmartDataContext())
{
    dbContext.Configuration.ProxyCreationEnabled = false;
    var query = dbContext.EntityMasters.OfType<Person>();
    if (includeAddress)
        query.Include(p => p.Addresses);
    if (includeFiles)
        query.Include(p => p.FileMasters);
    output.Entity = query.FirstOrDefault<Person>(e => e.EntityId == id);
}

我试图包括地址,基于布尔标志来自函数的文件。然而,EF在使用IF条件时似乎没有包括它们。

这与我之前的问题有关,实际上使用Include是有效的。

实体框架中INCLUDE的奇怪行为

需要将Include的结果赋值给query

query = query.Include(p => p.Addresses);

实体框架的'Include'函数只有在连接到查找实体的整个linq查询时才有效。这是因为linq查询实际上是Expression的一种形式,可以在执行之前作为一个整体进行检查。

在第二个示例中,Person对象已经与数据库分离,因此EF没有关于Person来自哪个表以及如何将Person与地址表连接以获得所需结果的信息。

如果你打开动态代理生成EF能够跟踪实体和数据库之间的关系。但是,我不确定这是否会使include语句工作。