我们刚刚更新到 EF6,与以前的版本相比,出现了一个奇怪的行为问题。
如果属性可以为空,则 EF 用于为 Include 语句生成 LEFT JOIN。然而,看起来这个版本也考虑了 [required] 属性。
例如,我有以下课程:
public class Client
{
[DisplayName("Industry Code")]
[Required]
public int? IndustryId { get; set; }
[ForeignKey("IndustryId")]
public Industry IndustryEntity { get; set; }
}
当我们这样做
return db.Clients
.Include(o => o.CountryISOEntity)
....
.Include(o => o.IndustryEntity)
.Single(o => o.Id == clientId);
以前的版本生成了 LEFT OUTER JOIN,但新版本生成了 INNER JOIN。
如果我删除 [required] 属性,它会生成 LEFT JOIN。但在我的情况下,这不是一个选项,因为我们使用此属性向用户显示错误,但是用户可以选择保存不完整的实体并稍后返回它。当用户回来时,它会收到一个错误,即记录不存在,因为包含生成 INNER JOIN。
新的 EF6 中是否有设置来禁用此行为(忽略属性)并根据可为空的信息生成 sql 查询?或者我可以强制包含中的 LEFT JOIN 吗?还是我们回滚到以前的 EF 版本的唯一选择?
PS:我们使用的是.Net 4.0
谢谢