gpt4 book ai didi

c# - ef6 include() 用于具有必需属性的可空属性

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:21 25 4
gpt4 key购买 nike

我们刚刚更新到 EF6,与以前的版本相比,存在一个奇怪的行为问题。

EF 用于在属性可为 null 时为 Include 语句生成 LEFT JOIN。但是看起来这个版本也考虑了 [required] 属性。

例如我有以下类(class):

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

谢谢

最佳答案

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

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

如果您为 Client 创建 View 模型,则可以从 EF POCO 中删除验证属性。

View 模型看起来像这样:

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; }
}

关于c# - ef6 include() 用于具有必需属性的可空属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19711079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com