现在我正在使用代码优先方法为数据库创建模型。这将是一个非常大的数据(如数百万行)。所以,我正在努力对我选择的类型非常谨慎。尽可能使用短路,字节和枚举。
现在,StringLength和MaxLength注释都限制了字符串的最大允许长度(或后者的数组)。
那么,他们是否指定数据库为该字段保留的字节数?如果是这样,当没有指定它们时保留多少字节?或者它们仅用于验证目的,仅此而已?
我甚至不确定数据库中的保留空间是否与我选择的类型相关。也许内部逻辑完全不同。
当我想到它时,另一个问题出现在我脑海中。如果我使用StringLength(1000)添加“Article”列,会发生什么?考虑到一个 char 占用2个字节,现在每个字段保留2kB吗?或者它与此完全无关?
答案 0 :(得分:1)
此行为取决于各种参数。首先在您的数据库上,如SQL Server或MySQL,然后它依赖于整理也像utf8,latin1和所有。
我在MySQL DB上运行了两个案例,结果就是这样。
<强>型号:强>
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);
}
表格强>
因此它创建了VARCHAR(1000)
和LONGTEXT
字段。它所包含的数据长度再次完全取决于字段的整理/编码。
LONGTEXT
大小:4,294,967,295 =(2 ^ 32-1)字节= 4 GiB
LONGTEXT
可包含4,294,967,295字节的数据。 UTF-8包含多字节字符。因此,如果仅使用丹麦字符“Ø”填充字段,则只能获得2,147,483,647个字符,因为UTF-8字符由两个字节组成。如果你用“a”填充它,你将获得4,294,967,295个字符。
答案 1 :(得分:0)
如果你没有在字符串属性上指定StringLength或MaxLength,。net将不会验证任何内容,但是如果违反了约束,数据库将抛出异常。 例如: - db中col1的大小为100,如果传递大小为200的值,则会抛出db异常。
当你在db中声明一个大小为1000的列时,当它以编程方式获取时,单个字段的大小将为2 kb,除非你在查询时应用trim。
属性主要用于声明,信息和验证目的。 属性是一个声明性标记,用于向运行时传递有关程序中各种元素(如类,方法,结构,枚举器,程序集等)的行为的信息。您可以使用属性将声明性信息添加到程序中。声明性标记由位于其所用元素上方的方括号([])括号描述。
属性用于向程序添加元数据,例如编译器指令和其他信息,如注释,描述,方法和类。 .Net Framework提供两种类型的属性:预定义属性和自定义构建属性。