如何使用 .include 查询实体框架 6 强制外连接

Ale*_*akh 4 .net c# entity-framework outer-join entity-framework-6

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

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;}
}
Run Code Online (Sandbox Code Playgroud)

sUser表在请求输入系统后填充。在输入请求和未填充用户之间的某个位置,我尝试获取用户的所有请求(如果存在)(外连接)。

db.Requests.Include(r=>r.User).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

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

如何正确定义映射以便能够使用包含映射?我需要这个,include因为我的案例涉及了更多的表,我想用手动连接来完成所有操作

Iva*_*oev 5

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

如果情况并非如此,则意味着您的模型和数据库不同步。从属性中删除 [ Required] 注释Request.UserPhone即可完成。

更新: EF 严重依赖通过约定、数据注释和流畅配置提供的模型元数据。所有的决定都是根据这些信息做出的。例如,当您根据需要配置持久基元属性时,null查询中针对该属性的所有检查都将被删除,并在查询转换时解析为常量truefalse。这同样适用于人际关系。在查询内部(并且Include是特定的查询构造),EF 使用它们来确定连接的基数和连接的类型。当查询关系的一侧时, FK 的Required/属性控制是否生成 a或join。 OptionalINNERLEFT OUTER

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