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

news2024/10/7 5:18:57

文章目录

  • 背景描述
  • 实际操作
    • 环境安装
      • Nuget包安装
      • 三者之间的关系
      • ORM解释
    • 项目从零开始创建过程
      • 新建项目
      • 安装nuget
      • DB first和Code first
      • 新建文件
      • 注意,DbContext命名
      • 运行测试
      • 基础增删改查和原生sql操作
        • 增,删,改
        • sql语句执行
          • sql查询
          • sql执行/增删改

背景描述

实际操作

环境安装

以我的环境举例

.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");

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/632805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QFIELD在遥感数据处理中的应用

概述 从卫星图像生成的土地覆盖绘图需要地面实况数据&#xff0c;以便“训练”分类算法&#xff0c;并计算最终地图的准确性。地面实况数据由具有准确位置的数据点和来自已知土地覆盖类型的预定义列表的标签组成。本教程将指导用户完成斐济苏瓦训练区的地面实况数据收集。 收…

chatgpt赋能python:Python反向画圆的方法

Python反向画圆的方法 介绍 Python是一种高级编程语言&#xff0c;在数据科学、机器学习、Web开发等领域具有广泛的应用。其中&#xff0c;Python的图形绘制能力也颇为强大&#xff0c;可以利用Python编写出各种图形和动画效果。本文将介绍Python如何反向画圆&#xff0c;通过…

chatgpt赋能python:Python如何去除空行?

Python如何去除空行&#xff1f; 在Python编程中&#xff0c;经常会遇到需要去除文本文件或字符串中的空行的情况。空行通常是在文件或字符串中不希望存在的&#xff0c;因为它们可能会影响代码的可读性和执行效率。但是&#xff0c;如何才能在Python中高效地去除空行呢&#…

CSS布局模式之Flex布局Grid布局

文章目录 1. 简介1.1 什么是CSS布局&#xff1f;1.2 为什么使用CSS布局&#xff1f; 2. Flex布局2.1 什么是Flex布局&#xff1f;2.2 Flex容器和Flex项目2.3 Flex容器的属性2.3.1 flex-direction2.3.2 justify-content2.3.3 align-items2.3.4 align-content 2.4 Flex项目的属性…

计算机视觉-目标检测(一):从 R-CNN 到 Faster R-CNN

文章目录 1. 概要2. 区域卷积卷积神经网络R-CNN2.1 模型结构2.2 Selective Search2.3 warp2.4 R-CNN训练2.5 R-CNN推理2.6 R-CNN性能评价2.7 R-CNN的缺点 3. SPP-Net3.1 SPP-Net对RCNN的改进3.2 SPP-Net网络结构3.3 SPP-Net训练过程3.4 SPP-Net的问题 4. Fast R-CNN4.1 Fast R-…

浅析设计模式 -- 责任链模式

目录 前言 概述 基本概念 ▐ 结构 ▐ 使用 使用示例 ▐ 代码实现​​​​​​​ ▐ 结果输出 ▐ UML图 扩展 源码赏析 优缺点及适用场景 ▐ 优点 ▐ 缺点 ▐ 适用场景 前言 我们在进行软件开发时要想实现可维护、可扩展&#xff0c;就需要尽量复用代码&…

【数据结构与算法】深入浅出:单链表的实现和应用

&#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ 目录 前言 单链表的基本概念 节点 头节点 尾节点 单链表的基本操作 创建单链表 头插法&#xff1a; 尾插法&#…

Shell脚本学习记录(常见指令)

Shell echo命令 Shell 的 echo 指令与 PHP 的 echo 指令类似&#xff0c;都是用于字符串的输出。命令格式&#xff1a; echo string 1.显示普通字符串: echo "It is a test" //双引号省略效果相同 2.显示转义字符 echo "\"It is a test\"" …

chatgpt赋能python:Python取出字典中键名对应的值

Python取出字典中键名对应的值 作为一个有10年Python编程经验的工程师&#xff0c;我经常遇到需要从字典中取出键名对应的值的情况。在这篇文章中&#xff0c;我将介绍Python中几种不同的方法来执行这个任务&#xff0c;并提供有关每个方法的优缺点的评估。让我们开始吧&#…

chatgpt赋能python:Python怎么取余数?

Python怎么取余数&#xff1f; 在Python中&#xff0c;我们经常需要进行数学运算&#xff0c;而其中计算余数也是经常用到的。虽然计算余数的方法似乎很简单&#xff0c;但是在不同的编程语言中有些微小的差异。本文将介绍在Python中如何高效地计算余数&#xff0c;以及一些相…

【动态规划】NK刷题记之DP6 连续子数组最大和(C语言实现)

【动态规划】NK刷题记之DP6 连续子数组最大和&#xff08;C语言实现&#xff09; 一、题目二、题解 2.1动态规划2.2贪心算法2.1.1 贪心算法的定义2.2.2贪心算法的性质2.2.3本题的贪心算法解决思路 2.2.4贪心与动态规划的区别 三、代码实现 3.1法一&#xff1a;动态规划(递归实…

无需公网IP,在家使用IPV6和电信光猫进行内网穿透以搭建远程主机

ipv4的公网IP弄起来还是比较麻烦&#xff0c;所以不管是搭建私人NAS还是远程登陆主机都总是需要进行内网穿透。一般的方案都是用花生壳这类的商用服务&#xff0c;然而这些服务一方面又贵又慢还有流量限制&#xff0c;另一方面还要进行把三代信息都盘出去的实名认证 1G到5G一个…

System V通信

文章目录 共享内存什么是共享内存&#xff08;物理内存块属性&#xff09;共享内存的接口认识查看共享内存删除共享内存共享内存的创建&#xff08;ftok和shmget&#xff09;挂接和去关联&#xff08;shmat和shmdt&#xff09; 利用共享内存通信&#xff08;简单的代码演示&…

Vue中如何进行数据缓存

Vue中如何进行数据缓存 Vue是一款流行的前端框架&#xff0c;它提供了许多方便的功能来处理数据。其中一个非常有用的功能是数据缓存。数据缓存可以提高应用程序的性能&#xff0c;减少网络请求&#xff0c;提高用户体验。在本文中&#xff0c;我们将介绍Vue中如何进行数据缓存…

chatgpt赋能python:Python如何取三位小数

Python 如何取三位小数 Python 是一种很强大的编程语言&#xff0c;可以应用于各个领域。其中&#xff0c;处理数字也是 Python 的一项强大功能。当我们需要对数字进行精细的操作时&#xff0c;常常需要使用到取小数的功能。本文将介绍如何使用 Python 取三位小数&#xff0c;…

Qgis中进行Shp和Excel属性连接实现百强县公共预算空间分析

前言 在之前的博文中&#xff0c;将2022的全国百强县一般公共预算收入的数据下载到了本地&#xff0c;博客原文地址&#xff1a;一种使用Java的快速将Web中表格转换成Excel的方法。对于不关注时空位置关系的一般分析&#xff0c;到此也就基本够用了。但是&#xff0c;如果站在全…

C语言函数初阶(1)

目录 1. 函数是什么 2. 库函数 3. 自定义函数 4. 函数参数 5. 函数调用 6. 函数的嵌套调用和链式访问 7. 函数的声明和定义 8. 函数递归 今天我们讲解前6个部分&#xff0c;下一个博客我们讲解后2个部分&#xff0c;因为后两个部分难度较大&#xff0c;讲解起来要花一点…

Vue中如何进行错误处理

Vue中如何进行错误处理 在Vue应用程序中&#xff0c;错误处理是必不可少的。错误可能发生在各种地方&#xff0c;例如网络请求、组件生命周期钩子函数、计算属性、方法等等。如果我们不正确地处理这些错误&#xff0c;可能会导致应用程序崩溃或无法正常工作。在本文中&#xf…

chatgpt赋能python:Python怎么反向切片

Python怎么反向切片 在Python中&#xff0c;切片是一种用于从序列中选取子序列的方法。正向切片从序列的第一个元素开始选取&#xff0c;而反向切片则从序列的最后一个元素开始选取。本文将介绍Python中如何使用反向切片。 什么是切片 在Python中&#xff0c;切片是一种操作…

IP协议的特性总结

目录 1. 地址管理 1.1 动态分配 1.2 NAT(网络地址转换)机制 1.3 IP地址的组成 1.4 IP地址网络号和主机号的划分 1.4.1 IP地址分类(ABCDE类) 1.4.2 子网掩码 1.5 特殊的IP地址 2. 路径规划 3. IP协议报文格式 3.1 分包 3.2 组包 1. 地址管理 IP地址在之前跟大家简单…