gpt4 book ai didi

c# - 用于处理空字符串的数据注释

转载 作者:行者123 更新时间:2023-12-04 16:41:58 25 4
gpt4 key购买 nike

我使用 EF Core Powertools 将一组表从我的 Db 逆向工程为 EF 数据模型。

在表中创建记录时,一个或多个 varchar 字段被标记为允许为空。

如果我更新这些字段上的实体属性以使用

[Required(AllowEmptyStrings = true)]

这将允许空字符串通过,但是在查询表中已经包含一个或多个这些字段的空值的实体列表时,不会因为属性而失败吗?例如。它不只是空的,它是空的。

那么如何修改实体定义,既允许保存空字符串,又允许查询结果中的空值呢?

最佳答案

tl;博士
该属性不能帮助您进行数据验证。它甚至会给您带来麻烦,因为它限制了您的查询选项。

首先,与 EF6 不同,EF 核心不进行任何数据验证。因此,任何属性都无法实现您阻止空字符串进入可为空的数据库字段的良好意图。

更糟糕的是,属性会给你带来麻烦。 SQL 查询生成受是否需要属性的影响。让我演示一下使用这个小类:

public class Product
{
public int ID { get; set; }

[Required(AllowEmptyStrings = true)] // or false
public string Name { get; set; }
}

这个查询...

string name = "a";
var products = db.Products
.Where(x => x.Name == name)
.ToList();

...with [Required](AllowEmptyStrings false 或 true)生成此 WHERE 子句:

WHERE ([p].[Name] = @__name_0) AND @__name_0 IS NOT NULL

没有属性不外乎:

WHERE (([p].[Name] = @__name_0) AND ([p].[Name] IS NOT NULL AND @__name_0 IS NOT NULL))
OR ([p].[Name] IS NULL AND @__name_0 IS NULL)

EF 这样做是为了获得与 C# 中相同的 null 语义。在 SQL 中,当 @__name_0NULL 并且查询不会返回任何内容时,只有 [p].[Name] = @__name_0 未确定记录,甚至不是 Name 为空的记录。 C# 中的相同 LINQ 查询会。第二个 WHERE 子句中的额外空检查说明 [Name]@__name_0 均为空的情况,在 C# 中为认为相等。顺便说一句,如果需要,这些空语义可以替换为数据库空语义。

当需要该字段时,EF 假定该字段值永远不会为空,并且它会省略这个额外的条件。 这种假设会给您带来麻烦。当显式查询它们时,查询将永远不会返回具有空名称的记录甚至string name = null; 将不会返回名称为空的记录。

但现在,总而言之,EF 甚至不允许您通过附加条件显式查询 null 值:

var products = db.Products
.Where(x => x.Name == name || x.Name == null)
.ToList();

EF 只是忽略 name == null 条件。如此确定该字段不能包含该查询的空值...

var products = db.Products
.Where(x => x.Name == null)
.ToList();

产生这个 SQL 谓词:

WHERE CAST(0 AS bit) = CAST(1 AS bit)

对不起?请问我可以查询空值吗?你在那里,背负着一个遗留数据库,试图通过从现在开始制作必填字段来尽你所能,但 EF 使它几乎不可能。在 EF6 中也是如此。

长话短说:不要使用属性。只会害人而无益。

替代品

  • 您自己进行这些验证。 This博客有很多建议。
  • 如果使用 ASP.Net,请使用具有属性的 DTO/ View 模型对象来获得早期数据输入验证。不过,这并不能替代保存时的所有数据验证。
  • (首选)通过将空字符串转换为有用的东西来修复遗留数据并使用该属性,因为它(现在有益)对查询的影响以及它对其他框架(如 ASP.Net)中的模型验证的影响。

关于c# - 用于处理空字符串的数据注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58983184/

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