.net framework 命令行项目使用 sqlite,DbContext

实际操作

环境安装

以我的环境举例

.net framwordk = 4.7.2

新建项目

在这里插入图片描述

Nuget包安装

  • EntityFramework:数据库框架
    在这里插入图片描述
  • SQLite.CodeFirst:实体对象转换为数据库映射关系
    在这里插入图片描述
  • System.Data.SQLite:sqlite数据库操作

在这里插入图片描述

Tips:SQLite内置安装包,安装该nuget回自动安装多个配套程序集

在这里插入图片描述

安装结果
在这里插入图片描述

三者之间的关系

EF:ORM操作框架,但不包括数据库基本操作(我感觉默认自带sql server数据库操作)
Sqlite:Sqlite数据库操作,EF接管
Sqlite.CodeFirst:自动从实体类转换成sqlite表对象

ORM解释

ORM,又称对象关系数据库。在ORM里面认为,我们操作的对象属性和数据库里面的列的定义是对应的。比如一个Student类,有id,name,age,sex等属性,那么我们C#程序中的类也有id,name,age,sex等属性。而且我的类名和你的表名完全一致,我的数据类型和你的数据库也有对应关系(例如C#的string在数据库里面有varchar(50),varchar(max),nchar(10)等)。

项目从零开始创建过程

新建项目

在这里插入图片描述

安装nuget

在这里插入图片描述

DB first和Code first

这个是EF的数据库提出想法。如果程序对象和数据库对象完全一致,那么有两个问题

  • 是先设计数据库还是先设计程序对象?
  • 如果更新属性,是先设置

新建文件

新建文件和文件夹

  • DB:数据库操作
    • Entity:数据库对象,即数据表
      • Student:测试类
      • Teacher
    • Mapper:数据库业务,暂时为无
    • ORMDbContext:数据库上下文,即Sqlite数据库操作封装文件

在这里插入图片描述

Student

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SqliteTest3.DB.Entity
{
    public class Student
    {

        [Key]//主键
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]//自动递增
        public int Id { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

        public string Sex { get; set; }


        public int TeacherId { get; set; }
    }
}

Teacher

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SqliteTest3.DB.Entity
{
    public class Teacher
    {

        [Key]//主键
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]//自动递增
        public int Id { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

        public string Sex { get; set; }
    }
}



ORMContext


using SQLite.CodeFirst;
using SqliteTest3.DB.Entity;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SqliteTest3.DB
{
    public class ORMContext:DbContext
    {

        //引入数据表对象
        public DbSet<Student> Students {  get; set; }

        public DbSet<Teacher> Teachers { get; set; }



        //重载DbContext生成方法,在生成DbContext的时候执行数据库生成操作
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //注入我们设置的DbContext,判断数据库是否存在,不存在则创建对应数据库
            var sqliteConnect = new SqliteCreateDatabaseIfNotExists<ORMContext>(modelBuilder);
            //执行创建数据库对应操作
            Database.SetInitializer<ORMContext>(sqliteConnect);
        }

        //读取配置文件connectionStrings,创建数据库映射
        public ORMContext() : base("ORMContext") { }

    }
}

App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
	.......
 + <connectionStrings>
    + <add name="ORMContext" connectionString="data source=.\SqliteTest.db" providerName="System.Data.SQLite.EF6" />
 + </connectionStrings>
......
  <entityFramework>
    <providers>
      ...
      + <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>
  ......
</configuration>

注意,DbContext命名

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这里三者必须强制一致,不然会报错

如果报这个错误

在这里插入图片描述
这个Bug我是不知道怎么运行出来的,因为C#你看不到源码,我就不能看到里面进行了什么操作。

在这里插入图片描述
但是报了个找不到"System.Data.SQLite" 的操作,那么只能猜是继承的时候内置了System.Data.SQLite操作

解决方法

在这里插入图片描述

神奇的bug

运行测试

using SqliteTest3.DB;
using SqliteTest3.DB.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SqliteTest3
{
    internal class Program
    {
        //引入DbContext
        private static ORMContext _dbContext = new ORMContext();
        static void Main(string[] args)
        {
            for(var i = 0;i < 10;i++)
            {

                _dbContext.Students.Add(new Student
                {
                    Name = "小李",
                    Age = i,
                    Sex = "男"
                });

            }

            _dbContext.SaveChanges();//保存缓存操作

            var ListRes = _dbContext.Students.Where(t=>t.Name == "小李").ToList();
        }
    }
}

运行结果,我按键截图会把临时数据显示隐藏,我就拍照了

在这里插入图片描述

或者使用navicat 来查看数据库是否有数据

在这里插入图片描述

基础增删改查和原生sql操作

这里使用了ES6的语法


//查List
var ListRes = _dbContext.数据表.Where(t=>判断条件).ToList();
var ListRes = _dbContext.Students.Where(t=>t.Name == "小李").ToList();

//查第一个,如果没有则返回null
var res = _dbContext.Students.Where(t=>t.Name == "小李").FirstOrDefault();

//排序
OrderBy:升序
OrderByDescending:降序
var res = _dbContext.Students.Where(t=>t.Name == "小李").OrderByDescending(t=>t.Id).ToList();
增,删,改

由于ORM是对象数据模型,所以所有的数据操作都是对一个完整的对象进行操作。EF具有缓存追踪的设置,如果你查询出来的数据进行了修改,然后保存缓存的话,就会同步更新。

 _dbContext.Students.Add(new Student
 {
     Name = "小李",
     Age = i,
     Sex = "男"
 });
 _dbContext.SaveChanges();//保存缓存操作
 var resList = _dbContext.Students.Where(t=>t.Age == 0).ToList();
//将所有年龄为0的人的名字改成"修改名称"
 resList.ForEach(item => {
     item.Name = "修改名称";
 });

 _dbContext.SaveChanges();//保存缓存操作

在这里插入图片描述

//删除所有年龄小于5岁的人
var resList = _dbContext.Students.Where(t=>true).ToList();

resList.ForEach(t => {
    if(t.Age < 5)
    {
        _dbContext.Students.Remove(t);
    }
});

_dbContext.SaveChanges();//保存缓存操作

在这里插入图片描述

sql语句执行
sql查询

实体查询

var res = _dbContext.Database.SqlQuery<Student>("Select * from Students").ToList();

在这里插入图片描述
如果你要多表联查,那就没有实体对象了(因为你多表联查的列名是不固定的,动态的)

那就返回一个DataSet对象:DataSet对象不了解的可以自己搜索一下

在这里插入图片描述

在这里插入图片描述

sql执行/增删改
_dbContext.Database.ExecuteSqlCommand("update Students set sex = '女' where age = 6");

在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要在 .NET Framework 4.7.2 使用 EF6 DbContext 创建 SQLite 数据库和多张数据表,您可以按照以下步骤操作: 1. 安装 SQLite 数据库引擎和 ADO.NET 数据提供程序。您可以从 SQLite 官网下载 SQLite 数据库引擎和 ADO.NET 数据提供程序的安装文件,然后按照提示进行安装。 2. 在 Visual Studio 中创建一个新的 .NET Framework 项目,选择“类库”作为项目类型。 3. 在“解决方案资源管理器”中,右键单击项目名称,选择“管理 NuGet 程序包”。 4. 在“NuGet 包管理器”中搜索并安装以下两个包: - EntityFramework - System.Data.SQLite 5. 在项目中添加一个新的类文件,命名为“MyDbContext.cs”。 6. 在“MyDbContext.cs”文件中,定义一个继承自“DbContext”的类,并添加以下代码: ```csharp using System.Data.Entity; public class MyDbContext : DbContext { public MyDbContext() : base("name=MyDbContext") { } public DbSet<Table1> Table1 { get; set; } public DbSet<Table2> Table2 { get; set; } } ``` 在上面的代码中,“Table1”和“Table2”是您需要创建的数据表的实体类,它们应该与数据库中的表对应。 7. 创建实体类“Table1.cs”和“Table2.cs”,并在其中定义数据表的结构。例如: ```csharp public class Table1 { [Key] public int Id { get; set; } public string Name { get; set; } } ``` 在上面的代码中,“Id”是主键,它会自动递增,您可以添加其他属性。 8. 在“App.config”文件中添加以下配置: ```xml <configuration> <connectionStrings> <add name="MyDbContext" connectionString="Data Source=MyDatabase.sqlite" providerName="System.Data.SQLite" /> </connectionStrings> </configuration> ``` 在上面的配置中,“MyDatabase.sqlite”是您要创建的 SQLite 数据库的名称。 9. 在“Program.cs”文件中添加以下代码,以创建数据库并初始化数据表: ```csharp using System.Data.Entity; class Program { static void Main(string[] args) { Database.SetInitializer<MyDbContext>(new CreateDatabaseIfNotExists<MyDbContext>()); using (var context = new MyDbContext()) { context.Database.Initialize(false); } } } ``` 在上面的代码中,“SetInitializer”方法设置了数据表的初始化策略,这里我们使用“CreateDatabaseIfNotExists”策略,表示如果数据库不存在,则创建一个新的数据库。然后,通过“Initialize”方法初始化数据库和数据表。 10. 运行程序,您应该能够在 SQLite 数据库中看到创建的数据表。 以上就是在 .NET Framework 4.7.2 中使用 EF6 DbContext 创建 SQLite 数据库和多张数据表的步骤。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值