DataAnnotations 模型配置

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

注意:Fluent API  >  注释  >   约定

  • 包括和排除类型或者属性
    • 按照约定,有三种方式可以发现类型;DbSet中的类型,在 OnModelCreating 中的类型,在已发现类型中发现的其它任何类型;
    • 使用 注释 方法排除
      [NotMapped]
      public class BlogUpdate
      {
          public int BlogId { get; set; }
          public DateTime updateTime { get; set; }
      }
    • 使用 Fluent API 排除
      builder.Ignore<BlogDetail>();
      builder.Entity<BlogDetail>().Ignore(b => b.LoadedFromDatabase);
  • 主键
    • 按照约定,名为 Id 或者 <type name>Id 的属性会被配置成主键
    • 注释 方式: [Key]
    • Fluent API 方式:
      builder.Entity<Car>().HasKey(c => c.LicensePlate);

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

      builder.Entity<Car>().HasKey(c => new { c.State, c.LicensePlate });
  • 必需和可选
    • 按照约定,不能设置 null 的属性将自动认为属性必需,如 int/decimal/bool 等
    • 特性名称: [Required]
    • Fluent API:
      builder.Entity<Blog>().Property(b => b.Url).IsRequired();
  • 最大长度
    • 按照约定,最大长度仅适用于数组数据类型的属性,如 string / byte[]
    • 注释方式: [MaxLength(10)]
    • Fluent API 方式:
      builder.Entity<Blog>().Property(b => b.Url).HasMaxLength(500);  
  • 并发标记
  • 关系
  • 索引
    • 只能使用 Fluent API 来创建索引
    • 默认情况下,索引是非唯一的;可以指定索引唯一;还可以指定多个列为索引
      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 });
  • 值的转换
  • 初始数据(Data Seeding)
    • 模型初始数据
      builder.Entity<Blog>().HasData(
          new Blog { BlogId = 1, Url ="http://sample.com" });
  • 表特性
    • 按照约定,默认将类名称设置为数据库表名称的标识,有必要下可以特别指定
    • 注释方式:[Table("name"), Schema = "schema"]
    • Fluent API 方式:
      builder.Entity<Blog>().ToTable("blogs", schema: "blogging");
  • 列特性
    • 按照约定,每个属性将会设置为映射到与属性具有相同名称的列
    • 当需要设置精确的数据类型,可以设置 TypeName 属性
    • 注释方式:[Column("blog_id", TypeName = "decimal(10,2)")]
    • Fluent API 方式:
      builder.Entity<Blog>().Property(b => b.BlogId).HasColumnName("blog_id");
      builder.Entity<Blog>(eb =>
        {
      eb.Property(b => b.Url).HasColumnType("varchar(200)");
      eb.Property(b => b.Rating).HasColumnType("decimal(5, 2)");
      });
  • 默认值
    • 按照约定,如果插入新行,未指定值的列将被插入默认值
    • Fluent API 方式:
      builder.Entity<Blog>().Property(b => b.Rating).HasDefaultValue(3);
      builder.Entity<Blog>().Property(b => b.Created).HasDefaultValueSql("getdate()");

转载于:https://www.cnblogs.com/leehomlee/p/11567472.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值