EFcore的实体类配置

1 约定配置

约定大于配置,框架默认了许多实体类配置的规则,在约定规则不满足要求时,可以显示地定义规则
1 数据库表明在不指定的情况下,默认使用的是数据库上下文类【DBContext】中DbSet 的属性名;
2 数据库表列的名字默认使用的是实体类属性的名字;列的数据类型采用与实体类属性类型相兼容的类型;
3 数据库列的可空性取决于对应实体属性的可空性;
4 实体类的属性为Id时,在数据库中对应的是主键,若属性类型为short、int、long类型时,则在数据库中默认是自增的

2 显示定义模型类配置规则

该文章使用的是MySQL的数据库,这里使用到了模型驱动开发的模式【现有实体类,后有数据库表。需要使用到迁移指令的使用,本篇文章的重点不是迁移指令的使用,所以忽略该内容】

2.1 Fluent API

使用框架定义的方法去配置模型类与数据库表的关系,通常在实现了IEntityTypeConfiguration《T》的Configure(EntityTypeBuilder builder)方法中去使用FluentAPI的方式去配置

   public  class Book
    {
        /// <summary>
        /// 书籍ID
        /// </summary>
        public long Id { get; set; }
        /// <summary>
        /// 标题
        /// </summary>
        public string? Title { get; set; }
        /// <summary>
        /// 发布时间
        /// </summary>
        public DateTime PublishTime { get; set; }
        /// <summary>
        /// 价格
        /// </summary>
        public double Price { get; set; }
        /// <summary>
        /// 作者名称
        /// </summary>
        public string ?AuthorName { get; set; }
        /// <summary>
        /// 描述
        /// </summary>
        public string Desc { get; set; }

    }
    internal class BookConfiguration : IEntityTypeConfiguration<Book>
    {
        public void Configure(EntityTypeBuilder<Book> builder)
        {
            //Book类对应数据库中的tb_book表
            builder.ToTable<Book>("t_books");

            //使用Fluent API的方式,显示地去配置类模型与数据库表的关系
            //HasColumnName指定数据库中列的名字
            builder.Property(e => e.Id).HasColumnName("id").IsRequired();
            //HasColumnType指定数据库中列的数据类型
            builder.Property(e => e.AuthorName).HasColumnType("varchar(100)").HasColumnName("author_name");
            //HasMaxLength 设定列的最大长度
            builder.Property(e => e.Title).HasColumnName("title").HasMaxLength(200);
            builder.Property(e => e.Price).HasColumnName("price");
            builder.Property(e => e.PublishTime).HasColumnName("publish_time");
            //实体类的属性默认全部会映射到数据库表中,可以使用Ignore去忽略制定的属性
            builder.Ignore(e=>e.Desc);

        }
    }

使用迁移指令后Update-database,将同步更新数据库中表信息。数据结构如下
在这里插入图片描述

2.2 Data Annotation

使用特性 【 A n n o t a t i o n 】 \textcolor{red}{【Annotation】} Annotation的方式去配置模型类与数据库表的映射关系

    
   //Table 指定表名称
 [Table("t_students")]
 internal class Student
 {
     public int Id { get; set; }

     //MaxLength 指定栏位长度 Required 指定列值必填
     [MaxLength(100)]
     [Required]
     public string Name { get; set; }

     public int  Age { get; set; }

 }

使用迁移指令后Update-database,将同步更新数据库中表信息。数据结构如下
在这里插入图片描述

2.3 如何选用自定义配置规则

Data Annotation 相较于使用FluentAPI的方式更为简洁,只需要使用特性标注即可,不需要单独的写配置类,不过FluentAPI更为强大,能够完全替代Data Annotation ,但是使用特性的方式则无法完全取代FluentAPI。微软官方默认推荐使用FluentAPI去配置模型类,不过两者是可以同时混用的,可以在Data Annotation无法实现的情况下使用FluentAPI去配置模型类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值