C# 如果我没有在字符串属性上指定StringLength或MaxLength,会发生什么?

C# 如果我没有在字符串属性上指定StringLength或MaxLength,会发生什么?,c#,asp.net,database,entity-framework,ef-code-first,C#,Asp.net,Database,Entity Framework,Ef Code First,现在,我正在使用代码优先的方法为数据库创建模型。这将是一个真正的大数据,如数百万行。所以,我尽量对我选择的类型非常小心。尽可能使用简短、字节和枚举 现在,StringLength和MaxLength注释都限制了字符串或数组的最大允许长度 那么,它们是否指定了数据库为该字段保留的字节数?如果是这样的话,在未指定字节的情况下保留了多少字节?或者它们仅仅是为了验证而不是别的 我甚至不确定数据库中的保留空间是否与我选择的类型相关。也许内在的逻辑是完全不同的 当我想到它时,另一个问题突然出现在我的脑海里。

现在,我正在使用代码优先的方法为数据库创建模型。这将是一个真正的大数据,如数百万行。所以,我尽量对我选择的类型非常小心。尽可能使用简短、字节和枚举

现在,StringLength和MaxLength注释都限制了字符串或数组的最大允许长度

那么,它们是否指定了数据库为该字段保留的字节数?如果是这样的话,在未指定字节的情况下保留了多少字节?或者它们仅仅是为了验证而不是别的

我甚至不确定数据库中的保留空间是否与我选择的类型相关。也许内在的逻辑是完全不同的

当我想到它时,另一个问题突然出现在我的脑海里。如果我添加一个StringLength为1000的文章列,会发生什么?考虑到一个字符占用2个字节,它现在是否为每个字段保留2kB?或者它与此完全无关?

如果您没有在字符串属性上指定StringLength或MaxLength,.net不会验证任何内容,但如果违反了约束,数据库将抛出异常。 例如:-col1的大小是100(以db为单位),如果传递大小为200的值,它将抛出一个db异常

当以db为单位声明一个大小为1000的列时,当以编程方式获取该列时,单个字段的大小将为2 kb,除非在查询时应用trim

属性主要用于声明、信息和验证目的。 属性是一个声明性标记,用于向运行时传递有关程序中各种元素(如类、方法、结构、枚举数、程序集等)行为的信息。您可以使用属性向程序中添加声明性信息。声明性标记由置于其所用元素上方的方括号[]表示


属性用于向程序添加元数据,如编译器指令和其他信息,如注释、描述、方法和类。Net Framework提供两种类型的属性:预定义属性和自定义构建属性。

此行为取决于各种参数。首先是SQL Server或MySQL之类的数据库,然后是utf8、latin1之类的排序规则

我已经在MySQL数据库上运行了这两个案例,结果如下

型号:

生成的迁移:

表:

因此,它创建了VARCHAR1000和LONGTEXT字段。同样,它包含的数据长度完全取决于字段的排序/编码

长文本大小:4294967295=2^32−1字节=4 GiB


LONGTEXT可以包含4294967295字节的数据。UTF-8包含多字节字符。因此,如果仅使用丹麦字符Ø填充字段,则只能获得2147483647个字符,因为UTF-8字符由两个字节组成。如果用a填充,将得到4294967295个字符。

这可能取决于您使用的数据库平台。您自己在自己的数据库上尝试过这个吗?发生了什么?几乎所有问题的答案都是发生了什么,如果。。。或者我可以。。。简单地说就是:尝试一下,看看会发生什么。在这种情况下,我们如何知道您的数据库的功能?它是MS SQL Server 2017。不,我还没有机会尝试,数据库现在是空的。我可能会尝试测试自己添加虚拟数据,但客户正在等待,我现在必须在这个项目上努力工作:我认为这是一个常识。我对这个数据库的东西很陌生。@EmreCanSerteli Commonsense不太常见,我亲爱的朋友:那么,这些列的大小约束不是由我的代码决定的吗?我应该一直用这些标签吗?如果你用的话,会更好。流应该始终是数据库设计到代码。Anyways实体框架自动生成具有相关属性的类。所以您不需要承担额外的开销。@Sumitraj那么CodeFirst方法呢?谢谢您的测试。现在我明白了,如果没有指定,它是LONGTEXT,如果指定,它是VARCHAR。让我直截了当地说,这些约束只用于将用户限制在一定的输入长度。无论列是VARCHAR1还是VARCHAR1000,所有字段都用单个字符a填充。它将占用相同的空间,并且数据将以相同的速度响应我的查询……对吗?我没有在SQL Server上尝试过这种方法。我认为当您不指定StringLength时,它将生成为VARCHARMAX。因此,它也会影响列大小。如果将StringLength`指定为1000,则只需1000个字符。如果列中的数据较大,则查询速度会较慢。
public virtual string field1 { get; set; }

[StringLength(1000)]
public virtual string field2 { get; set; }
protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.AddColumn<string>(
        name: "field1",
        table: "Category",
        nullable: true);

    migrationBuilder.AddColumn<string>(
        name: "field2",
        table: "Category",
        maxLength: 1000,
        nullable: true);
}