我们刚刚更新到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。但在我的情况下,它不是一个选项,因为我们使用此属性向用户显示错误,但是用户可以选择保存不完整的实体并稍后返回。当用户返回时,它会收到一条错误,表明该记录不存在,因为include会生成INNER JOIN。
新EF6中是否有设置禁用此行为(忽略属性)并根据可空信息生成sql查询?或者我可以在包含中强制LEFT JOIN吗?或者是我们回滚到以前的EF版本的唯一选择吗?
PS:我们正在使用.Net 4.0
由于
答案 0 :(得分:0)
我假设你想在MVC中使用Required
属性进行表单验证,而不是告诉Entity Framework该属性是必需的。这就是您需要视图模型的原因,因此您可以将视图的验证逻辑与实体框架验证逻辑分开。
您的视图模型表示视图,并包含呈现视图所需的所有数据。域模型(实体)表示数据库中的一个(或多个)表。视图模型不一定包含与域模型相同的属性。根据我的个人经验,他们通常是不同领域模型的组合。
如果您为Client
创建视图模型,则可以从EF POCO中删除验证属性。
视图模型如下所示:
public class ClientModel
{
[DisplayName("Industry Code")]
[Required]
public int IndustryId { get; set; }
// Other properties..
}
然后你的POCO看起来像这样:
public class Client
{
public int? IndustryId { get; set; }
[ForeignKey("IndustryId")]
public Industry IndustryEntity { get; set; }
}