[英]What happens if I don't specify CompilerVersion with CSharpCodeProvider and why do most samples specify it?
[英]What happens if I don't specify StringLength or MaxLength on a string property?
现在,我正在使用代码优先方法为数据库创建模型。 这将用于非常大的数据(如数百万行)。 因此,我在选择类型时要格外小心。 尽可能使用短裤,字节和枚举。
现在,StringLength和MaxLength注释都限制了字符串(或后者的数组)的最大允许长度。
因此,它们是否指定数据库为该字段保留的字节数? 如果是这样,未指定字节时将保留多少字节? 还是仅出于验证目的而已?
我什至不确定数据库中的保留空间是否与我选择的类型有关。 也许内部逻辑是完全不同的。
当我考虑这件事时,我脑海中浮现出另一个问题。 如果我使用StringLength(1000)添加“文章”列,会发生什么情况? 考虑到一个char占用2个字节,是否现在为每个字段保留2kB? 还是与之完全无关?
此行为取决于各种参数。 首先在您的数据库(如SQL Server或MySQL)上,然后取决于排序规则(如utf8,latin1等)。
我已经在MySQL数据库上运行了这两种情况,这就是结果。
模型:
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个字符。
如果未在字符串属性上指定StringLength或MaxLength,则.net不会验证任何内容,但如果违反约束,则数据库将引发异常。 例如:col1的大小在db中为100,并且您传递的大小为200,它将抛出db异常。
当您声明以db为单位的大小为1000的列时,将以编程方式获取该列时,单个字段的大小将为2 kb,除非您在查询时应用trim。
属性主要用于声明,信息和验证目的。 属性是一个声明性标记,用于向运行时传达有关程序中各种元素(例如类,方法,结构,枚举器,程序集等)的行为的信息。 您可以使用属性将声明性信息添加到程序中。 声明性标记由放置在用于该标记的元素上方的方括号([])表示。
属性用于将元数据(例如编译器指令)和其他信息(例如注释,描述,方法和类)添加到程序。 .Net Framework提供两种类型的属性:预定义属性和自定义生成的属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.