我们刚刚更新到EF6,并且遇到了与以前版本相比出现奇怪行为的问题。ef6 include()对于具有所需属性的可为null的属性
如果属性为空,则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查询?或者我可以强制包含在左边的JOIN?或者是我们唯一的选择回滚到以前的EF版本?
PS:我们使用的是.NET 4.0
感谢
不要骗实体框架。如果您告诉它该属性是必需的,Entity Framework将相信它确实是必需的。为什么使用内置的'Required'属性具有您不喜欢的特定含义,而不是使用自定义属性? – hvd
因为它运行得很好:)我以为MVC使用Required属性,但不是EF。如果必须将所有必需属性更改为与“必需”完全相同但未由EF拾取的自定义属性,那么这就是精神上的问题。一般而言,我相信如果以前的版本以某种方式表现出来,在刹车应用程序时改变这种行为并不是一个好主意。 – Intetics
EF中EF也使用RequiredAttribute。但是,是的,我可以同意,如果在EF5中的使用方式不同,那么至少应该明确沟通变化。 – hvd