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

时间:2017-05-19 10:33:29

标签: c# .net entity-framework entity-framework-6 outer-join

我的数据模型如下。 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;}
}

在将请求输入系统后填充User表。在输入请求和用户未填充之间的某处我试图获取用户的所有请求(如果存在)(外部联接)。

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

这给了我零结果,因为EF执行了内连接(定义了我的UserPhone字段并且是外键,并且它是Requests表所必需的。)

如何正确定义映射以便能够使用包含映射?我需要include因为我的案例触及了几个我希望用手动连接完成的表

1 个答案:

答案 0 :(得分:4)

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

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

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

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