动态生成值
无值生成
要保存某个字段的值,先赋值,再将这个实体添加到上下文中。
在添加时生成值
客户端生成和数据库生成,如果是数据库生成,当你将实体添加到上下文时,EF 可能会赋予 一个临时值,然后,调用SaveChanges() 时,数据库生成的值会替换这个临时值。
要特别说明的是:如果将一个属性被赋值的实体添加上下文时,不会生成新值,被赋值的认定 标准是未被属性赋予CLR 默认值,如:string 的默认值为 null,int 的默认值为 0, Guid.Empty 的默认值为 Guid。等等。
约定
类型为 short、int、long、或 Guid 的非复合主键会被设置在添加时生成值。 所有其他属性 会被设置为不生成值。
Data Annotations
不生成值 [DatabaseGenerated(DatabaseGeneratedOption.None)] public int BlogId { get; set; }
在添加时生成值 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public DateTime Inserted { get; set; }
在添加或更新时生成值 [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime LastUpdated { get; set; }
使用 Computed 无法赋值,只能通过计算获得。
Fluent API
模型映射配置 2019年4月1日 23:43
不生成值 modelBuilder.Entity<Blog>().Property(b => b.BlogId).ValueGeneratedNever();
添加时生成值 modelBuilder.Entity<Blog>().Property(b => b.Inserted).ValueGeneratedOnAdd();
添加或更新时生成值 modelBuilder.Entity<Blog>().Property(b => b.LastUpdated).ValueGeneratedOnAddOrUpdate();
必填或可选属性
数据库字段是否可空,取决于能否赋予一个属性NULL 值。
约定
其 CLR 类型可为 null 的属性将配置为可选 (string, int?, byte[],等等),其它反之。
Data Annotations
[Required] public string Url { get; set; }
Fluent API
modelBuilder.Entity<Blog>().Property(b => b.Url).IsRequired();
最大长度限制
最大长度仅适用于数组数据类型,如 string 和 byte[],超过指定长度,数据库将验证并抛出 异常。
约定
按照约定,数据库提供程序通常将选择允许最长数据长度的数据类型。nvarchar(max)
Data Annotations
[MaxLength(500)] public string Url { get; set; }
Fluent API
modelBuilder.Entity<Blog>().Property(b => b.Url).HasMaxLength(500);