《ASP.NET Core技术内幕与项目实战》精简集-EFCore2.4:映射配置FluentApi和主键

本节内容,涉及4.6(P84-P92)。主要NuGet包:如前述章节

 

一、配置映射关系,有两种方案,一是Data Annotation、二是如2.3节使用的Fluent Api,推荐使用Fluent Api。

 

二、Fluent Api的基本配置

//以下案例都在DbContext的OnModelCreating方法中配置,如下所示:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Article>(b =>
    {
        b.ToTable("T_Articles");
        b.Property(a => a.Title).HasMaxLength(50);
     });
}

//实体类与数据表或视图的映射
b.ToTable("T_Blogs");
b.ToView("V_Blogs");

//设置字段最大长度、必填和使用unicode字符(中文一般设置这个)
b.Propery(a => a.Name).HasMaxLength(100).IsRequired().IsUnicode();

//设置字段可空,不使用默认规则
b.Property(a => Remark).IsOptional();

//指定数据表字段名,不使用默认规则
b.Property(a => a.BlogId).HasColumnName("blog_id");

//指定数据表字段类型,不使用默认规则
b.Property(a => a.Title).HasColumnType("varchar(200)");

//排除某个属性的映射,即此属性不会建立数据表字段
b.Ignore(a => a.Name2);

//默认Id属性为主键,也可以设置主键,一般不建议这么干
b.HasKey(a => a.Number);

//设置索引,包括复合索引
b.HasIndex(a => a.Url);
b.HasIndex(a => new{a.FirstName,a.LastName});

//Fluent Api进行链式调用时,注意每种方法的返回值,如果返回值为同一种类型,则可以使用

 

三、主键设置

1、实际项目中,大多数使用以下两种:自增主键和Guid主键

2、自增主键:

  • 实体类中,Id属性类型设置为int或long类型时,按约定将Id设置为数据表中的自增主键。
  • 自增主键由数据库生成,所以在保存数据之前,即使用ctx.SaveChange方法前,Id值为默认值0。只有在数据保存之后,才可以获取Id值。
  • 自增主键是有序主键,自动设置为聚集索引,性能比较好,但因为不是跨数据表唯一,在分库合并、分布式应用时,会存在主键重复问题。
  • 自增主键是有顺序的,所以通过浏览器调用Api时,可以很容易通过Id号判断数据表和业务情况,也容易被恶意访问。

3、Guid主键

  • 实体类中,Id属性设置为Guid类型时,按约定将Id设置为Guid类型的主键。
  • Guid由服务器生成,①可以手动生成,如“a.Id = Guid.NewGuid()”;②调用ctx.Articles.Add()方法时,会自动生成。所以在保存数据之前,就可以获得Guid值。
  • Guid根据当前计算机和网络生成,全球唯一,在分库合并、分布式应用时,不存在重复问题,更加友好。但AspNetCoe创建的Guid值是无序的,所以不能设置为聚集索引,性能会差一些。而且一个Guid值很长,比Id更占空间,当然这点可以忽略不计。
  • 在AspNetCore中生成的Guid值是无序的,但现在有类库可以生成有序的Guid值,可以设置为聚集索引,这就解决了性能问题。同时,这些Guid值,即使有序了,但仍然是随机的,可以避免自增主键容易被猜透的问题。所以一些框架全部都使用Guid作为主键,比如ABP。

 

 

特别说明:
1、本系列内容主要基于杨中科老师的书籍《ASP.NET Core技术内幕与项目实战》及配套的B站视频视频教程,同时会增加极少部分的小知识点
2、本系列教程主要目的是提炼知识点,追求快准狠,以求快速复习,如果说书籍学习的效率是视频的2倍,那么“简读系列”应该做到再快3-5倍

 

posted @ 2022-10-29 10:27  functionMC  阅读(404)  评论(0编辑  收藏  举报