如何使用 .Include 查询强制外连接 Entity Framework 6

How to force outer join with .Include query Entity Framework 6

我的数据模型如下。 UserPhone 是必需的,但导航 属性 是可选的,只要 User 的 table 可以为空:

public class Request
{
    [Key]
    public int Id {get;set;}
    [Required]
    public string UserPhone {get;set;}
    [ForeignKey("UserPhone")]
    public virtual User User {get;set;}
}

public class User
{
    [Key]
    public string UserPhone {get;set;}
}

Users table 在请求输入系统后填充。在输入请求和未填充用户之间的某处,我正在尝试获取用户的所有请求(如果存在)(外部连接)。

db.Requests.Include(r=>r.User).FirstOrDefault();

这给我零结果,因为 EF 进行了内部连接(我的 UserPhone 字段已定义并且外键是请求 table 所必需的)。

如何正确定义映射才能使用包含映射?我需要 include 因为我的案例涉及更多 table 我想通过手动连接完成所有操作

INNER JOIN 因为您已将 FK 属性 配置为 [Required]。因此,从 EF 的角度来看,相关的 User 记录应该始终存在。

如果不是这样,则表示您的模型和数据库不同步。从 Request.UserPhone 属性 中删除 [Required] 注释,你就完成了。

更新: EF 严重依赖于通过约定、数据注释和流畅配置提供的模型元数据。所有的决定都是基于这些信息做出的。例如,当您根据需要配置持久原语 属性 时,查询中针对 属性 的所有 null 检查都将被删除,并在查询转换时解析为常量 [=16] =] 或 false。这同样适用于关系。内部查询(Include 是一个特定的查询结构)它们被 EF 使用来确定连接的基数和连接的 type。查询one关系时,FK的Required / Optional 属性控制是INNER还是LEFT OUTER 连接生成。

因此,控制 EF 行为的唯一方法是为其提供来自实体模型的正确元数据。无法动态控制/更改特定操作的行为。