Code First 数据库的表中属性的配置
数据类型的约定配置
默认规则 |
列的数据类型是由数据库决定的,SqlServer的默认规则如下 String: nvarchar(MAX) Int:int Bool:bit Decimal:decimal(18,2) Byte[]:varbinary(MAX) |
DataAnnotation |
[Column(TypeName=”varchar”)] |
Fluent |
modelBuilder.Entity<Category>().Property(c=>c.Name).HasColumnType(“varchar”) |
数据类型的长度约定配置
默认规则 |
max |
DataAnnotation |
[MaxLength(100)] [MinLength(10)] [StringLength(50)] |
Fluent |
modelBuilder.Entity<Category>().Property(c=>c.Name).HasMaxLength(50) |
列是否可空的约定配置
默认规则 |
主键非空 外键可以为空 Int,bit,decimal,dateTime非空 Varchar,varbiary 可以为空 |
DataAnnotation |
[Required] |
Fluent |
modelBuilder.Entity<Category>().Property(t=>t.Name).IsRequired() |
主键约定配置
默认规则 |
属性名称是Id,或者是类名称+Id作为主键 |
DataAnnotation |
[Key] |
Fluent |
modelBuilder.Entity<Category>().HasKey(c=>c.Id) |
EF框架要求每个实体都要有主键,没有主键会抛出异常,当你的主键是GUID时,需要特别处理,DataAnnotation :[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
Fluent:modelBuilder.Entity<Category>().Porperty(c=>c.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
时间戳
只有byte[]类型的属性可以映射TimeStamp
DataAnnotation:[Timespamp]
Fluent:modelBuilder.Entity<Category>().Property(c=>c.RowVersion).IsRowVersion()
Unicode数据类型
默认规则 |
默认为Unicode数据 |
DataAnnotation |
不能配置 |
Fluent |
IsUnicode() |
Decimal设置
默认规则 |
(8,2) |
DataAnnotation |
不可以设置 |
Fluent |
HasPrecision(10,2) |
复杂的数据类型
默认规则 |
复杂类型没有Key属性,用做其他类属性时,不能用做集合属性
|
DataAnnotation |
[Complex] |
Fluent |
modelBuilder.Complex<Address>() |