C# FreeSql使用,基于Sqlite的DB Frist和Code First测试

文章目录

  • 前言
  • FreeSql 简单连接
    • 数据库服务不存在
    • 没装FreeSql.All
    • 装了FreeSql.All
    • 安装包选择
  • DBFirst
    • 安装命令行生成器
    • 生成Bat创建脚本
  • 基于Sqlite的Code Frist
    • 文件夹自动导出到Debug目录
    • Sqlite 数据库安装和创建
    • Sqlite连接
    • 数据库自动增列增表测试
      • 增列
      • 删列
      • 改列名
      • 同名列改属性
    • CodeFrist的意义
  • 总结

前言

Freesql是一个C# 的ORM框架,C# 另一个框架是Sqlsugar。两个从Nuget下载量和Github的星星上面,其实都差不多。两个作者之间有点矛盾,但是我是一个局外人,啥都不懂,技术哪个好用用哪个,我平时做的也就是CRUD这种工作。

FreeSql相关链接

Freesql官方文档

SqlSugar我之前也用过

.NET SqlSuger 简单介绍,超快开发数据库

FreeSql 简单连接

Nuget安装一下

在这里插入图片描述

            //新建实例对象
            var MyFreeSql = new FreeSql.FreeSqlBuilder()
                .UseConnectionString(FreeSql.DataType.SqlServer, "你的数据库连接串")
                .Build();

            //测试网络连接
            MyFreeSql.Ado.ExecuteConnectTest();

数据库服务不存在

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第1张图片

原因是缺乏对应的数据库连接包

Freesql 指南安装

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第2张图片

对导出文件大小无所谓就直接用FreeSql.All即可
在这里插入图片描述

没装FreeSql.All

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第3张图片

装了FreeSql.All

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第4张图片

安装包选择

35MB其实还能接受,比较我们是快速开发,代码能跑就行。

DBFirst

FreeSql DbFirst

DBFirst导出有两种方式:

  • 直接在Debug文件导出,然后自己复制粘贴
  • 使用命令行直接生成

Sqlsugar是直接在Debug文件导出的,FreeSql是使用命令行去生成的。

安装命令行生成器

尝试全局安装,安装的时候会卡个一分钟,然后跳出成功界面

dotnet tool install -g FreeSql.Generator

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第5张图片
输入指令,查看是否安装成功

FreeSql.Generator --help

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第6张图片

生成Bat创建脚本

根据官方建议,在实体类根目录下面生成对应的bat文件

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第7张图片

填写对应的参数

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第8张图片

创建如下的Bat执行脚本文件
C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第9张图片

FreeSql.Generator -Razor 1 -NameOptions 0,0,0,1 -NameSpace LinCms.Core.Entities -DB "MySql,Data Source=127.0.0.1;Port=3306;User ID=root;Password=123456;Initial Catalog=lincms;Charset=utf8;SslMode=none;Max pool size=2"

运行成功
C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第10张图片
C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第11张图片
会生成一个重新生成的bat文件

基于Sqlite的Code Frist

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第12张图片

文件夹自动导出到Debug目录

为了方便资源文件夹的保存,我这里定义一个全局的资源文件夹

Visual Studio C# 项目生成时复制项目资源目录到生成目录

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第13张图片

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第14张图片

 <ItemGroup>
    
    <None Include="Resources\**">
      <CopyToOutputDirectory>PreserveNewestCopyToOutputDirectory>
    None>
  ItemGroup>

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第15张图片
生成成功
在这里插入图片描述

Sqlite 数据库安装和创建

FreeSql不会主动创建数据库,需要我们自己先手动创建

在这里插入图片描述

SQLite 在Windows环境下使用命令行shell创建SQLite数据库

命令行输入指令,确认Sqlite安装成功

sqlite3

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第16张图片
生成Sqlite数据库文件

sqlite3
.open mydatabase.db

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第17张图片
C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第18张图片

当然如果你有别的软件,比如Navicat Premium,也可以使用软件直接创建
C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第19张图片

Sqlite连接

FreeSql的Sqlite的连接串大概长这样

  • DataType.Sqlite
  • Data Source=|DataDirectory|\document.db; Attachs=xxxtb.db; Pooling=true;Min Pool Size=1

FreeSql CodeFirst 官方文档

测试一下数据库连接状态

  internal class Program
  {
      static void Main(string[] args)
      {
          //新建实例对象
          var MyFreeSql = new FreeSql.FreeSqlBuilder()
              .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=Resources\mydatabase.db; Attachs=test.db; Pooling=true;Min Pool Size=1")
              .Build();
          //测试网络连接
          var isConnect =   MyFreeSql.Ado.ExecuteConnectTest();
          Console.WriteLine($"数据库连接状态{isConnect}");

          Console.WriteLine("Hello, World!");
          Console.ReadKey();
      }
  }

在这里插入图片描述

数据库自动增列增表测试

默认有个main数据库

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第20张图片

测试代码

static void Main(string[] args)
{
    //新建实例对象
    var MyFreeSql = new FreeSql.FreeSqlBuilder()
        //连接test数据库
        .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=Resources\mydatabase.db; Attachs=test.db; Pooling=true;Min Pool Size=1")
        .UseAutoSyncStructure(true) //自动同步实体结构【开发环境必备】,FreeSql不会扫描程序集,只有CRUD时才会生成表。
        .UseMonitorCommand(cmd => Console.Write(cmd.CommandText))
        .Build();


    //MyFreeSql
    //测试网络连接
    var isConnect = MyFreeSql.Ado.ExecuteConnectTest();
    Console.WriteLine($"数据库连接状态{isConnect}");

    var students = MyFreeSql.Queryable<Student>().Take(100).OrderByDescending(t => t.Id).ToList();

    var teachers = MyFreeSql.Queryable<Teacher>().Take(100).OrderByDescending(t => t.Id).ToList();
    Console.WriteLine("Hello, World!");

    Console.ReadKey();
}

测试实体类

    /// 
    /// 学生类
    /// 
    public class Student
    {

        [Column(IsIdentity = true, IsPrimary = true)]
        public int Id { get; set; }
        public DateTime CreateTime { get; set; }
        public string Name { get; set; }

        public int StudentNo { get; set; }
    }
    /// 
    /// 教师类
    /// 
    public class Teacher
    {
        [Column(IsIdentity = true, IsPrimary = true)]
        public int  Id { get; set; }

        public int TeacherNo {  get; set; }

        public DateTime CreateTime { get; set; }
        public string Name { get; set; }
    }

打印语句
C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第21张图片
自动生成表结构

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第22张图片
C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第23张图片

为什么库名还是main?

根据我的理解,Sqlite3是一个数据库文件当做一个数据库的。所以库名不会改变

Sqlite数据库容量的上限是128TB,一般来说够用了。我公司用的SqlServer数据库,运行了5年也就900GB,1GB不到的数据+一堆事物(增删改查的记录)

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第24张图片

增列

 /// 
 /// 学生类
 /// 
 public class Student
 {

     [Column(IsIdentity = true, IsPrimary = true)]
     public int Id { get; set; }
     public DateTime CreateTime { get; set; }
     public string Name { get; set; }

     public int StudentNo { get; set; }


     /// 
     /// 增列测试
     /// 
     public int StudentId { get; set;}
 }

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第25张图片
C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第26张图片

删列

    /// 
    /// 学生类
    /// 
    public class Student
    {

        [Column(IsIdentity = true, IsPrimary = true)]
        public int Id { get; set; }
        public DateTime CreateTime { get; set; }
        public string Name { get; set; }

        //删掉该列
        //public int StudentNo { get; set; }


        /// 
        /// 增列测试
        /// 
        public int StudentId { get; set;}
    }

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第27张图片

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第28张图片

改列名

 /// 
 /// 学生类
 /// 
 public class Student
 {

     [Column(IsIdentity = true, IsPrimary = true)]
     public int Id { get; set; }
     public DateTime CreateTime { get; set; }
     public string Name { get; set; }

     /// 
     /// 改列名从StudentNo改成StudentNoNew
     /// 
     public int StudentNoNew { get; set; }


     /// 
     /// 增列测试
     /// 
     public int StudentId { get; set;}
 }

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第29张图片
C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第30张图片
经过多次测试,确实会同步改列名,这个我不知道是怎么做到的,估计是根据反射属性的顺序进行判断

同名列改属性

public class Student
{

    [Column(IsIdentity = true, IsPrimary = true)]
    public int Id { get; set; }
    public DateTime CreateTime { get; set; }
    public string Name { get; set; }

    /// 
    /// 改列属性
    /// 
    public string StudentNoNew { get; set; }


    /// 
    /// 增列测试
    /// 
    public int LALAL { get; set; }
}

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第31张图片

C# FreeSql使用,基于Sqlite的DB Frist和Code First测试_第32张图片

CodeFrist的意义

使用了CodeFrist,第一就是敏捷开发,程序员不需要知道数据库新增表,新增列是如何操作的,只需要关注业务代码。而且就可以使用基础和泛型了

    /// 
    /// 声明抽象基类
    /// 
    public abstract class SqliteBase
    {

        [Column(IsIdentity = true, IsPrimary = true)]
        public int Id { get; set; }
        public DateTime CreateTime { get; set; }
    }
    /// 
    /// 学生类
    /// 
    public class Student:SqliteBase
    {


        public string Name { get; set; }

        /// 
        /// 改列属性
        /// 
        public string StudentNoNew { get; set; }


        /// 
        /// 增列测试
        /// 
        public int LALAL { get; set; }
    }

    /// 
    /// 教师类
    /// 
    public class Teacher:SqliteBase
    {
        public int TeacherNo {  get; set; }

        public DateTime CreateTime { get; set; }
        public string Name { get; set; }
    }

而且可以使用泛型方法,泛型约束,扩展方法。这里就不展开说明了。简单来说就是可以更加规范的使用。至少在使用Sqlite数据库的时候可就可以使用Code Frist敏捷开发,毕竟就是用来做本地缓存数据库的,数据表变来变去无所谓,能存数据就行。

总结

FreeSql 用起来还是很不错的,毕竟主打的就是ORM懒人开发,把底层的逻辑交给程序,自己把重点关心在业务逻辑上面。

你可能感兴趣的:(C#,数据库,c#,sqlite)