配置EF使之在映射数据时绕开约定:注释和Fluent API。注释仅涵盖一部分Fluent API功能。
通过重写DbContext
上的OnModelCreating
方法来访问Code First Fluent API。
属性映射
Property方法用于为每个属于实体或复杂类型的属性配置特性。Property方法用于获取给定属性的配置对象。配置对象上的选项特定于要配置的类型(IsUnicode只能用于字符串属性)
配置主键
有关主键的实体框架约定如下:
- 类定义名称称为“ID”或“Id”的属性
- 或类名后跟“ID”或"Id"
要显示将某个属性设置为主键,可使用HasKey方法。
modelBuilder.Entity<Person>().HasKey(t => t.Id)
配置组合主键
modelBuilder.Entity<Person>().HasKey(t => new { t.Id ,t.Name});
关闭数值主键标识
modelBuilder.Entity<Person>().Property(t => t.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
指定属性的最大长度
如果超出最大长度,将引发DbEntityValidationException
异常
modelBuilder.Entity<Person>().Property(t => t.Name)
.HasMaxLength(50);
将属性配置为必须
modelBuilder.Entity<Person>().Property(t => t.Name)
.IsRequired();
指定不将CLR属性映射到数据库中的列
modelBuilder.Entity<Person>().Ignore(t => t.Name);
将CLR属性映射到数据库中的特定列
以下将Name CLR属性映射到数据库中的"myNmae"列
modelBuilder.Entity<Person>().Property(t => t.Name)
.HasColumnName("myname");
配置字符串属性是否支持unicode内容
默认情况下,字符串为Unicode(sqlserver中的nvarchar),可以使用IsUnicode方法指定字符串为varchar类型
modelBuilder.Entity<Person>()
.Property(t => t.Name).IsUnicode(false);
配置数据库列的数据类型
modelBuilder.Entity<Person>()
.Property(t => t.Name).HasColumnType("varchar");
将属性配置为用作并发令牌
modelBuilder.Entity<OfficeAssignment>()
.Property(t => t.Timestamp)
.IsConcurrencyToken();
类型映射
将类型指定为复杂类型
按约定,没有指定主键的类型将被视为复杂类型。在一些情况下,Code First不会检测复杂类型
modelBuilder.ComplexType<Details>();
指定不将CLR实体类映射到数据库中的表
modelBuilder.Ignore<OnlineCourse>();
将CLR实体类型映射到数据库中的特定表
modelBuilder.Entity<Department>()
.ToTable("t_Department");
也可以指定架构名称
modelBuilder.Entity<User>().ToTable("User","System");