当我们在构建模型的时候,除使用约定来定义实体类以外,还可以使用 数据注释(特性) 和 Fluent API(重写 OnModelCreating 方法) 的方式来配置模型
    注意:Fluent API > 注释 > 约定

    • 包括和排除类型或者属性
      • 按照约定,有三种方式可以发现类型;DbSet中的类型,在 OnModelCreating 中的类型,在已发现类型中发现的其它任何类型;
      • 使用 注释 方法排除
    1. [NotMapped]
    2. public class BlogUpdate
    3. {
    4. public int BlogId { get; set; }
    5. public DateTime updateTime { get; set; }
    6. }
    • 使用 Fluent API 排除

    builder.Ignore();
    builder.Entity().Ignore(b => b.LoadedFromDatabase);

    • 主键
      • 按照约定,名为 Id 或者 Id 的属性会被配置成主键
      • 注释 方式: [Key]
      • Fluent API 方式:

    builder.Entity().HasKey(c => c.LicensePlate);

    • 还可以使用 Fluent API 将多个属性设置成主键(复合键)

    builder.Entity().HasKey(c => new { c.State, c.LicensePlate });

    • 必需和可选
      • 按照约定,不能设置 null 的属性将自动认为属性必需,如 int/decimal/bool 等
      • 特性名称: [Required]
      • Fluent API:

    builder.Entity().Property(b => b.Url).IsRequired();

    • 最大长度
      • 按照约定,最大长度仅适用于数组数据类型的属性,如 string / byte[]
      • 注释方式: [MaxLength(10)]
      • Fluent API 方式:

    builder.Entity().Property(b => b.Url).HasMaxLength(500); 

    builder.Entity<Blog>().HasIndex(b => b.Url);
    builder.Entity<Blog>().HasIndex(b =>`` b.Url).IsUnique();
    builder.Entity<Person>().HasIndex(p => ``new`` { p.FirstName, p.LastName });

    builder.Entity().HasData(
    new Blog { BlogId = 1, Url =”http://sample.com“ });

    • 表特性
      • 按照约定,默认将类名称设置为数据库表名称的标识,有必要下可以特别指定
      • 注释方式:[Table(“name”), Schema = “schema”]
      • Fluent API 方式:

    builder.Entity().ToTable(“blogs”, schema: “blogging”);

    • 列特性
      • 按照约定,每个属性将会设置为映射到与属性具有相同名称的列
      • 当需要设置精确的数据类型,可以设置 TypeName 属性
      • 注释方式:[Column(“blog_id”, TypeName = “decimal(10,2)”)]
      • Fluent API 方式: DataAnnotations 模型配置 - 图1

    builder.Entity().Property(b => b.BlogId).HasColumnName(“blog_id”);
    builder.Entity(eb =>
     {
    eb.Property(b => b.Url).HasColumnType(“varchar(200)”);
    eb.Property(b => b.Rating).HasColumnType(“decimal(5, 2)”);
    });

    • DataAnnotations 模型配置 - 图2
      • 默认值
    • 按照约定,如果插入新行,未指定值的列将被插入默认值
    • Fluent API 方式:

    builder.Entity().Property(b => b.Rating).HasDefaultValue(3);
    builder.Entity().Property(b => b.Created).HasDefaultValueSql(“getdate()”);