【发布时间】:2013-10-31 15:49:48
【问题描述】:
我们刚刚更新到 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
谢谢
【问题讨论】:
-
不要对实体框架撒谎。如果您告诉它该属性是必需的,Entity Framework 将相信它确实是必需的。为什么要使用内置的
Required属性,而不是使用自定义属性? -
因为它之前运行良好 :) 我认为 MVC 使用了 Required 属性,而不是 EF。如果我必须将所有必需属性更改为与必需属性完全相同但未被 EF 拾取的自定义属性,那是很明智的。总的来说,我相信如果以前的版本以一种方式表现,那么改变这种行为并不是一个好主意,因为它会阻碍应用程序。
-
RequiredAttribute 也被 EF 在 EF5 中使用。但是,是的,我同意如果它在 EF5 中以不同的方式使用,那么至少应该清楚地传达更改。
标签: c# .net asp.net-mvc-3 entity-framework