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