2

我们刚刚更新到 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

谢谢

4

1 回答 1

0

我假设您想Required在 MVC 中使用该属性进行表单验证,而不是告诉实体框架该属性是必需的。这就是您需要视图模型的原因,因此您可以将视图的验证逻辑与实体框架验证逻辑分开。

您的视图模型代表一个视图并包含呈现视图所需的所有数据。域模型(实体)代表数据库中的一个(或多个)表。视图模型不一定包含与域模型相同的属性。以我个人的经验,它们通常是不同领域模型的组合。

如果为 a 创建视图模型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; }
}
于 2013-10-31T16:22:17.533 回答