- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 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_0
为 NULL
并且查询不会返回任何内容时,只有 [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 中也是如此。
长话短说:不要使用属性。只会害人而无益。
关于c# - 用于处理空字符串的数据注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58983184/
我正在尝试创建一个程序,其中字符串的前三个字符重复给定次数,如下所示: foo('Chocolate', 3) # => 'ChoChoCho' foo('Abc', 3) # => 'AbcAbcA
我有以下字符串: std::string str = "Mode:AAA:val:101:id:A1"; 我想分离一个位于 "val:" 和 ":id" 之间的子字符串,这是我的方法: std::st
DNA 字符串可以是任意长度,包含 5 个字母(A、T、G、C、N)的任意组合。 压缩包含 5 个字母(A、T、G、C、N)的 DNA 字母串的有效方法是什么?不是考虑每个字母表 3 位,我们可以使用
是否有一种使用 levenstein 距离将一个特定字符串与第二个较长字符串中的任何区域进行匹配的好方法? 例子: str1='aaaaa' str2='bbbbbbaabaabbbb' if str
使用 OAuth 并使用以下函数使用我们称为“foo”(实际上是 OAuth token )的字符串加密 key public function encrypt( $text ) { // a
我是一名优秀的程序员,十分优秀!