标签:
使用Fluent API 配置/映射属性和类型 简介通常通过重写派生DbContext 上的OnModelCreating 方法来访问Code First Fluent API。以下示例旨在显示如何使用 Fluent API 执行各种任务,您可以将代码复制出来并进行自定义,使之适用于您的模型。
属性映射Property 方法用于为每个属于实体或复杂类型的属性配置特性。Property 方法用于获取给定属性的配置对象。配置对象上的选项特定于要配置的类型;例如,IsUnicode 只能用于字符串属性。
配置主键要显式将某个属性设置为主键,可使用 HasKey 方法。在以下示例中,使用了 HasKey 方法对 OfficeAssignment 类型配置 InstructorID 主键。
modelBuilder.Entity<OfficeAssignment>().HasKey(t =>t.InstructorID);
配置组合主键以下示例配置要作为Department 类型的组合主键的DepartmentID 和 Name 属性。
modelBuilder.Entity<Department>().HasKey(t => new { t.DepartmentID, t.Name });
关闭数值主键的标识以下示例将DepartmentID 属性设置为System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.None,以指示该值不由数据库生成。
modelBuilder.Entity<Department>().Property(t =>t.DepartmentID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
指定属性的最大长度在以下示例中,Name属性不应超过 50 个字符。如果其值超过 50 个字符,则出现 DbEntityValidationException 异常。如果 Code First 基于此模型创建数据库,它还会将 Name 列的最大长度设置为50 个字符。
modelBuilder.Entity<Department>().Property(t =>t.Name).HasMaxLength(50);
将属性配置为必需在下面的示例中,Name属性是必需的。如果不指定 Name,,则出现 DbEntityValidationException 异常。如果 Code First 基于此模型创建数据库,则用于存储此属性的列将不可为空。
modelBuilder.Entity<Department>().Property(t =>t.Name).IsRequired();
指定不将CLR 属性映射到数据库中的列以下示例显示如何指定CLR 类型的属性不映射到数据库中的列。
modelBuilder.Entity<Department>().Ignore(t => t.Budget);
将CLR 属性映射到数据库中的特定列以下示例将Name CLR 属性映射到DepartmentName 数据库列。
modelBuilder.Entity<Department>().Property(t =>t.Name).HasColumnName("DepartmentName");
重命名模型中未定义的外键如果您选择不对CLR 类型定义外键,但希望指定它在数据库中应使用的名称,请编码如下:
modelBuilder.Entity<Course>()
.HasRequired(c => c.Department)
.WithMany(t => t.Courses)
.Map(m => m.MapKey("ChangedDepartmentID"));
配置字符串属性是否支持Unicode 内容默认情况下,字符串为Unicode(SQLServer 中的nvarchar)。您可以使用IsUnicode 方法指定字符串应为varchar 类型。
modelBuilder.Entity<Department>()
.Property(t => t.Name)
.IsUnicode(false);
配置数据库列的数据类型HasColumnType 方法支持映射到相同基本类型的不同表示。使用此方法并不支持在运行时执行任何数据转换。请注意,IsUnicode 是将列设置为 varchar 的首选方法,因为它与数据库无关。
modelBuilder.Entity<Department>()
.Property(p => p.Name)
.HasColumnType("varchar");
配置复杂类型的属性对复杂类型配置标量属性有两种方法。
可以对ComplexTypeConfiguration 调用Property。
modelBuilder.ComplexType<Details>()
.Property(t => t.Location)
.HasMaxLength(20);
也可以使用点表示法访问复杂类型的属性。
modelBuilder.Entity<OnsiteCourse>()
.Property(t => t.Details.Location)
.HasMaxLength(20);
将属性配置为用作乐观并发令牌要指定实体中的某个属性表示并发令牌,可使用 ConcurrencyCheck 特性或 IsConcurrencyToken 方法。
modelBuilder.Entity<OfficeAssignment>()
.Property(t => t.Timestamp)
.IsConcurrencyToken();
也可以使用IsRowVersion 方法将属性配置为数据库中的行版本。将属性设置为行版本会自动将它配置为乐观并发令牌。
modelBuilder.Entity<OfficeAssignment>()
.Property(t => t.Timestamp)
.IsRowVersion();
类型映射 将类指定为复杂类型按约定,没有指定主键的类型将被视为复杂类型。在一些情况下,Code First 不会检测复杂类型(例如,如果您有名为“ID”的属性,但不想将它用作主键)。在此类情况下,您将使用 Fluent API 显式指定某类型是复杂类型。
modelBuilder.ComplexType<Details>();
指定不将CLR 实体类型映射到数据库中的表以下示例显示如何排除一个 CLR 类型,使之不映射到数据库中的表。
modelBuilder.Ignore<OnlineCourse>();
将CLR 实体类型映射到数据库中的特定表Department 的所有属性都将映射到名为 t_ Department 的表中的列。
modelBuilder.Entity<Department>().ToTable("t_Department");
您也可以这样指定架构名称:
modelBuilder.Entity<Department>().ToTable("t_Department", "school");
映射“每个层次结构一张表(TPH)”继承