c#-如何使用.include查询强制外部联接Entity F...

codeday· 2019-11-11
本文来自 codeday ,作者 codeday
我的数据模型如下.用户电话是必需的,但导航属性是可选的,只要用户的表可以为空:

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;}
}

将请求输入系统后,将填充“用户”表.在输入请求和不填充用户之间的某个地方,我尝试与用户(如果存在)一起获取所有请求(外部联接).

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

由于EF进行了内部联接(因此定义了我的UserPhone字段和一个外键,这对于Requests表是必需的),因此给我零结果.

如何正确定义映射以能够使用包含映射?我需要包含,因为我的案子碰到了另外几个表,我想通过手动联接来完成所有这些工作

最佳答案
它执行INNER JOIN,因为您已将FK属性配置为[Required].因此,从EF的角度来看,相关的用户记录应始终存在.

如果不是这种情况,则意味着您的模型和数据库不同步.从Request.UserPhone属性中删除[Required]批注,然后完成.

更新:EF严重依赖通过约定,数据注释和流畅的配置提供的模型元数据.所有决定都是基于该信息做出的.例如,当您根据需要配置持久性原始属性时,将删除查询中对该属性的所有空检查,并在查询转换时将其解析为常数true或false.关系也是如此.内部查询(包括Include是一个特定的查询结构)被EF用来确定联接的基数和联接的类型.当查询关系的一侧时,FK的Required / Optional属性控制是否生成INNER或LEFT OUTER连接.

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