我的数据模型如下。 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
因为我的案例触及了几个我希望用手动连接完成的表
答案 0 :(得分:4)
它INNER JOIN
,因为您已将FK属性配置为[Required
]。因此,从EF的角度来看,相关的User
记录应始终存在。
如果不是这样,则表示您的模型和数据库不同步。从Required
属性中删除[Request.UserPhone
]注释,您就完成了。
更新: EF非常依赖于通过约定,数据注释和流畅配置提供的模型元数据。所有决定都是基于该信息做出的。例如,当您根据需要配置持久性原始属性时,查询中针对该属性的所有null
检查都将被删除,并在查询转换时解析为常量true
或false
。这同样适用于人际关系。内部查询(和Include
是一个特定的查询构造),EF使用它们来确定连接的基数和连接的类型。查询关系的一个侧时,FK的Required
/ Optional
属性控制是否生成INNER
或LEFT OUTER
联接。
因此,控制EF行为的唯一方法是向实体模型提供正确的元数据。无法动态控制/改变特定操作的行为。