EFCore-扩展

EFCore-扩展

EF Core-主键

EF Core来实现主键回显十分简单,甚至开发者什么都不需要做,在提交完操作之后,数据库会自动将实体类的主键赋值,即完成主键回显


Guid

UID(Globally Unique Identifier)是一种由算法生成的唯一标识符,通常用于在分布式系统中确保不同实体之间的唯一性。GUID通常是一个128位数,可以以多种格式表示,但最常见的形式是32个十六进制数字,分为5组,形式如下:8-4-4-4-12的数字组合,例如:550e8400-e29b-41d4-a716-446655440000

GUID的主要用途包括但不限于:

  • 数据库中的主键:当需要确保数据记录的唯一性时,可以使用GUID作为主键。
  • 软件开发:在软件开发过程中,特别是在跨平台或多用户环境中,GUID可以用来保证对象或组件的唯一性。
  • 分布式系统:在分布式计算环境中,GUID可以用来唯一地标识不同的节点或事务,从而避免冲突。

生成GUID的方法有很多,大多数现代编程语言都提供了生成GUID的功能。例如,在.NET框架中,可以通过System.Guid类来生成一个新的GUID;而在Python中,则可以使用uuid模块来创建GUID

注:不要把Guid主键设置为聚集索引,在MySQL中,插入频繁的表不要使用GUID作为主键

如果是一般的主键,由数据库生成,EFCore会在提交操作之后将主键回填到对象的属性中

EFCore在将数据插入数据库之前,会生成一个GUID主键,然后再执行插入操作,这个操作并不是由数据库来完成的

GUID.NewGuid,这一个API可以手动生成一个GUID


EF Code-逆向工程

DBFirst 是一种开发模式,它代表了一种“数据库优先”的开发策略

在这种模式下,开发者首先设计和创建数据库结构(如表、视图、存储过程等)

然后基于这个现有的数据库来生成数据模型类和上下文类

这种方式特别适合那些已经有现成数据库或者需要严格遵循已定义数据库结构的应用程序

在Java中,MyBatisX插件就是一个强大的逆向工程插件

依赖安装:

Npgsql.EntityFrameworkCore.PostgreSQL

Microsoft.EntityFrameworkCore.Tools

调用方法

Scaffold- DBContext "字符串链接四大件"
dotnet ef dbcontext scaffold "Your Connection String" Npgsql.EntityFrameworkCore.PostgreSQL [options]

推荐这种逆向工程工具只有在建项时候使用,后期手动更新


打印SQL语句

标准日志形式(引入日志框架)

在正常的注册Logging之后,在DBContext中的OnConfiguring方法中添加optionsBuilder.UseLoggerFactory(LoggerFactory);

LoggerFactory对象被注入到DBContext

public ILoggerFactory LoggerFactory { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    base.OnConfiguring(optionsBuilder);
    
    optionsBuilder.UseLoggerFactory(LoggerFactory);
}

LogTo(简单日志)

在DBContext中的OnConfiguring方法中调用LogTo方法完成打印日志

LogTo会反映出EFCore的工作流程展示出来

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    base.OnConfiguring(optionsBuilder);
    
    optionsBuilder.LogTo(msg => Console.WriteLine(msg));
}

TOQUERYSTRING

以上两种方法都无法纯粹的显示出EFCore编译的SQL语句

在对DbSet的对象(也就是表)进行LINQ查询后,会得到一个IQueryable对象

这个对象有一个EFCore提供的API,ToQueryString

这个API可以将IQueryable对象直接打印成SQL语句

var persons = myDbContext.Persons.Select(p => p);
var queryString = persons.ToQueryString();