首页 > 其他分享 >EF Core学习笔记 - 配置

EF Core学习笔记 - 配置

时间:2023-10-18 19:22:49浏览次数:35  
标签:Core Title builder EF 笔记 Entity modelBuilder void public

约定配置

1、主要规则

  1. 表名采用DbContext中对应的DbSet的属性名

  2. 数据表列的名字采用实体类属性的名字, 列的数据类型采用喝实体类属性类型最兼容的类型, 可以自定义设置

  3. 数据表列的可空性取决于对应实体类属性的可空性

  4. 名字为Id的属性为主键

    1. 如果主键为short, int或者long则默认采用自增

    2. 如果主键为Guid, 则默认采用Guid生成机制生成主键值

2、两种配置方法

(0)两种方法结合

  • 两种方法大部分功能重叠, 可以混用, 不推荐

(1)Data Annotation

  • 把配置以特性(Annotation)的形式标注在实体类中

  • 简单但耦合

[Table("T_Books")]
public class Book
{
    public long Id { get; set; }
    [Required]
    [MaxLength(50)]
    public string Title { get; set; }
    public DateTime PubTime { get; set; }
    public double Price { get; set; }
    [Required]
    [MaxLength(50)]
    public string AuthoName { get; set; }
}

(2)Fluent API 单独写个Configuration, 常用

  • 建议每个实体建一个单独的配置类, 再把配置写到单独的配置类中

  • 复杂却解耦

// book表的实体类配置
public class BookConfig : IEntityTypeConfiguration<Book>
{
    public void Configure(EntityTypeBuilder<Book> builder)
    {
        //绑定表
        builder.ToTable("T_Books");
        //设置字段属性
        builder.Property(b => b.Title).HasMaxLength(50).IsRequired();
        builder.Property(b => b.AuthoName).HasMaxLength(20).IsRequired();
    }
}
// 自定义数据库表配置
public class MyDbContext : DbContext
{
    // 映射表
    public DbSet<Book> Books { get; set; }
​
    // 指定链接数据库
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);
        //指定数据库链接字符串
        optionsBuilder.UseSqlServer("Server =.; Database = demo1; Trusted Connection = True; MultipleActiveResultSets = true");
    }
​
    // 指定配置类
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        //note 从当前程序集加载所有的表 => 类Configuraton, 所有实现IEntityTypeConfiguration<T>的类
        modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
    }
}

Fluent API

1、API

(1)视图

  • 视图与实体类映射

  • 不建议用视图

modelBuilder.Entity<Blog>().ToVie("blogsView");

(2)排除属性映射

  • DbContextmodelBuilder.Entity<T>.Ignore(e => e.Prop)

  • 在表的Configbuilder.Ignore(e => e.Prop)

public class BookConfig : IEntityTypeConfiguration<Book>
{
    public void Configure(EntityTypeBuilder<Book> builder)
    {
        //绑定表
        builder.ToTable("T_Books");
        //排除属性映射
        builder.Ignore(b => b.Price);
    }
}

(3)设置列名

public class BookConfig : IEntityTypeConfiguration<Book>
{
    public void Configure(EntityTypeBuilder<Book> builder)
    {
        //绑定表
        builder.ToTable("T_Books");
        //设置列名
        builder.Property(b => b.PubTime).HasColumnName("pub_time");
    }
}
modelBuilder.Entity<T>(e => e.Prop).HasColumnName("prop");

(4)设置列数据类型

public class BookConfig : IEntityTypeConfiguration<Book>
{
    public void Configure(EntityTypeBuilder<Book> builder)
    {
        //绑定表
        builder.ToTable("T_Books");
        //设置数据类型
        builder.Property(b => b.Title).HasColumnType("varchar(200)");
    }
}
modelBuilder.Entity<T>(e => e.Prop).HasColumnName("prop");

(5)配置主键

  • 默认把名字为Id或者实体名+Id的属性作为主键, 可以用HasKey()来配置

  • 支持复合主键, 不建议使用

public class BookConfig : IEntityTypeConfiguration<Book>
{
    public void Configure(EntityTypeBuilder<Book> builder)
    {
        //绑定表
        builder.ToTable("T_Books");
        //设置主键
        builder.HasKey(b => b.Id);
    }
}
    public class MyDbContext : DbContext
    {
        public DbSet<Book> Books { get; set; }
​
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //...
        }
​
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            //设置主键
            modelBuilder.Entity<Book>().HasKey(x => x.Id);
        }
    }

(6)生成列的值

  • 比如像某种计算列的生成, 不建议使用

builder.Property(b => b.Price).ValueGeneratedOnAdd();

(7)为属性设置默认值

builder.Property(b => b.Title).HasDefaultValue("aaa");
modelBuilder.Entity<Book>().Property(b => b.Title).HasDefaultValue("aaa");

(8)索引

A.索引
builder.HasIndex(b => b.Title);
modelBuilder.Entity<Book>().HasIndex(b => b.Title);
B.复合索引
builder.HasIndex(b => new { b.Id, b.Title });
modelBuilder.Entity<Book>().HasIndex(b => new { b.Id, b.Title });
C.唯一索引
builder.HasIndex(b => b.Title).IsUnique();
modelBuilder.Entity<Book>().HasIndex(b => b.Title).IsUnique();
D.聚合索引
builder.HasIndex(b => b.Title).IsClustered();
modelBuilder.Entity<Book>().HasIndex(b => b.Title).IsClustered();

2、尽量不要使用链式调用

  • 链式调用取决于前一个方法的返回值是否可以作为当前方法的调用者

标签:Core,Title,builder,EF,笔记,Entity,modelBuilder,void,public
From: https://www.cnblogs.com/phonk/p/17773140.html

相关文章

  • 2023/10/18 学习笔记
    VLAN网络vlan——虚拟局域网由于交换机所有的端口都在同一个广播域,只要发送广播会产生大量的垃圾信息,同时会有安全隐患(病毒)。解决这个问题有两种方法:物理解决:需要在交换机之间安装路由器(成本太大)逻辑解决:使用vlan虚拟网络技术vlan的优势:控制广播增强网络安全......
  • 【笔记】数据库、网络故障与恢复
    【笔记】数据库故障与恢复数据库故障主要分:事务故障、系统故障和介质故障事务故障是指事务在运行至正常终点前被终止,此时数据库可能出现不正确的状态。是由于事务程序内部错误而引起的,有些可以预期,如金额不足等,有些不可以预期,如非法输入、运算溢出等。类似于手动执行回滚恢......
  • Codeforces Round 882 (Div. 2) B. Hamon Odyssey
    给一个长为\(n\)的数组\(a_1,a_2,\cdots,a_n\)。定义\(f(l,r)=\&_{i=l}^{r}a_i\)。你需要对\(a\)进行分段,使得各段的\(f(l,r)\)之和最小。在各段\(f(l,r)\)之和最小的情况下,尽可能分出更多的段。输出满足上述条件下,\(a\)可分的段数。......
  • Internet-augmented language models through few-shot prompting for open-domain qu
    Internet-augmentedlanguagemodelsthroughfew-shotpromptingforopen-domainquestionanswering 其实我没怎么正经读过论文,尤其是带实验的,我目前认真读过的(大部头)也就是一些LLM的综述。记录这个文档主要是防止自己读着读着玩手机去了/注意力不集中了跑路了/没记录困惑导......
  • TS 踩坑笔记: 箭头函数添加泛型报错(Error: JSX element ‘T’ has no corresponding
    前言今天给大家分享一个在React项目中使用TypeScript遇到的错误项目背景React+TS的项目配置,项目中关于React组件的使用.tsx后缀,其他单纯的文件使用.ts后缀问题描述在React组件附近定义泛型的箭头函数时产生TS报错警告,原本以为是语法写错了但是实际上在.t......
  • 《代码大全》阅读笔记02
    1、以解决问题为导向不仅仅是要完成一个任务;一切的一切都以实际的问题和需求为导向,最终的目的只有一个,而不是一直变换目标,就是解决真正的问题;2、把程序员当人看我们在项目中要记得,这是一个项目团队,团队由不同的个体组成,总是需要磨合的,所以,这就需要我们不仅仅将成员当人看,也要......
  • [vue]精宏技术部试用期学习笔记 II
    精宏技术部试用期学习笔记(vue)router:vue的模拟路由前置准备安装vue-routerpnpmivue-router@4//安装版本4的vue-router可以在package.json文件中查看依赖"dependencies":{"vue":"^3.3.4","vue-router":"4"//这里},新建文件夹/src......
  • vue进行跳转之后出现Cannot read properties of undefined (reading 'router') TypeEr
    问题描述使用router进行页面跳转时,就出现了这样的问题:也就是这里出现了问题:问题解决本来是按照网上的教程:const_this=this;但是,但是,我本来就是用的这种方法呀~然后就打算直接在这个界面引用:importrouterfrom'@/router'router.push('/one');里面引用的跳转页面......
  • C++模板笔记
    参考文章:https://juejin.cn/post/7078530622527897631模板是C++的泛型编程机制,这种机制可以最大程度复用代码并且不会增加运行时开销模板分为函数模板和类模板函数模板函数模板是对函数的参数进行泛型化,传递给模板函数的类型实参可以是类,也可以是整型值,还可以是模板名比如://......
  • [vue]精宏技术部试用期学习笔记 I
    精宏技术部试用期学习笔记(vue)什么是vue?我个人对vue的理解是把html\css\js三件套融合起来的结构,同时用组件化的思维把一个页面装填起来同时让页面形成树状结构优点是方便多人员维护提高代码复用性如何创建一个vue项目?我这里使用的是vite+vue的轻量化项目,使用pnpm......