实际操作
环境安装
以我的环境举例
.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数据库操作封装文件
- Entity:数据库对象,即数据表
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对象不了解的可以自己搜索一下
文章来源:https://www.toymoban.com/news/detail-488784.html
sql执行/增删改
_dbContext.Database.ExecuteSqlCommand("update Students set sex = '女' where age = 6");
文章来源地址https://www.toymoban.com/news/detail-488784.html
到了这里,关于.net framework 命令行项目使用 sqlite,DbContext的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!