Entity Framework Core简单使用

news/2025/2/22 14:46:36/文章来源:https://www.cnblogs.com/getrainbow/p/18730841

它是微软官方发布的基于ADO.NET的ORM框架。通过EF可以很方便地将表映射到实体对象或将实体对象转换为数据库表。

ORM:将数据存储从域对象自动映射到关系型数据库的工具。ORM主要包括3个部分:域对象、关系数据库对象、映射关系。ORM使类提供自动化CRUD,使开发人员从数据库API和SQL中解放出来。

 

EFCore有2种开发模式:

1. 从数据库生成Class实体类(DataFirst);

2. 由实体类生成数据库表结构(CodeFirst);

 

EFCore主要特点:

1. 支持多种数据库:SQLServer、MySQL、SQLite等。

2. 支持LINQ查询

3. 支持迁移,当EFCore模型更改时通过几条命令即可转换为数据库表

4. 支持原生sql语句,面对复杂查询性能欠佳时可以使用原生sql进行查询

 

一、通过EF Core创建数据库表

一般采用代码优先(CodeFirst)的方式,需要先编写实体类,再生成数据库表。

1. 创建实体类

1.1 FluentAPI方式创建(推荐)

先创建实体类再对实体类进行配置

internal class Book
{public long Id { get; set; }/// <summary>/// 标题/// </summary>public string Title { get; set; }/// <summary>/// 发布日期/// </summary>public DateTime PubTime { get; set; }/// <summary>/// 单价/// </summary>public Double Price { get; set; }/// <summary>/// 作者名字/// </summary>public string AuthorName { get; set; }
}

创建一个实现了IEntityTypeConfiguration接口的实体类的配置类BookEntityConfig,它用于配置实体类和数据库表的对应关系

// 使用此接口指定要对哪个实体类进行配置
internal class BookEntityConfig : IEntityTypeConfiguration<Book>
{//对实体类和数据库表的关系进行详细配置public void Configure(EntityTypeBuilder<Book> builder){//设置表名builder.ToTable("T_Books");//设置Title字段最大值为50,并不能为空builder.Property(e => e.Title).HasMaxLength(50).IsRequired();builder.Property(e => e.AuthorName).HasMaxLength(20).IsRequired();}
}

1.2 通过数据注解的方式配置实体类

如果使用数据注解方式配置实体类,直接在定义类中的属性时,配置相应的注解即可。

public class Student
{[Key]public long Id { get; set; }[MaxLength(50)][Unicode][Required]public string Name { get; set; }[MaxLength(50)][Unicode][Required]public string Class { get; set; }public int Age { get; set; }[MaxLength(50)][Unicode][Required]public string Sex { get; set; }
}

2. 创建DbContext

创建实体类之后,需要创建继承自DbContext类的上下文类,并添加DbSet<实体>属性,该属性用于后续对表的操作。

internal class TestDbContext:DbContext
{//定义实体类属性,后续增删改查都用此对象public DbSet<Book> Books { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){//配置连接数据库字符串string connStr = "Data Source=REDMIBOOKPRO15\\SQL;Initial Catalog=EFCore;Integrated Security=True;Trust Server Certificate=True";//指定使用SqlServer数据库进行连接optionsBuilder.UseSqlServer(connStr);}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);//加载当前程序集中所有实现了IEntityTypeConfiguration接口的类modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);}
}

 3. 通过实体类生成数据库表

安装Microsoft.EntityFrameworkCore.Tools包

1. 在【程序包管理器控制台】中执行如下命令:Add-Migration InitialCreate  InitialCreate:给这次迁移取的名字

2. 执行成功后会生成Migrations文件夹,以及迁移配置文件
3. 执行 Update-database 命令执行数据库迁移代码
4. 查看数据库,此时表已经创建完成

二、EF Core的增删改查

1. 插入数据

using efCore;
//创建上下文对象,并使用using自动释放资源
using TestDbContext ctx = new TestDbContext();
//创建book对象数据
var b1 = new Book
{AuthorName = "杨中科",Title = "零基础趣学C语言",Price = 59.8,PubTime = new DateTime(2019, 3, 1)
};
var b2 = new Book
{AuthorName = "Robert Sedgewick",Title = "算法(第4版)",Price = 99,PubTime = new DateTime(2012, 10, 1)
};
var b3 = new Book
{AuthorName = "吴军",Title = "数学之美",Price = 69,PubTime = new DateTime(2020, 5, 1)
};
var b4 = new Book
{AuthorName = "杨中科",Title = "程序员的SQL金典",Price = 52,PubTime = new DateTime(2008, 9, 1)
};
var b5 = new Book
{AuthorName = "吴军",Title = "文明之光",Price = 246,PubTime = new DateTime(2017, 3, 1)
};
//添加数据
ctx.Books.Add(b1);
ctx.Books.Add(b2);
ctx.Books.Add(b3);
ctx.Books.Add(b4);
ctx.Books.Add(b5);
//将数据提交保存到数据库
await ctx.SaveChangesAsync();

2. 查询

using efCore;
//创建上下文对象,并使用using自动释放资源
using TestDbContext ctx = new TestDbContext();
//查询所有书
foreach(Book book in ctx.Books)
{Console.WriteLine($"Id={book.Id},Title={book.Title},Price={book.Price}");
}//查询价格高于80的书
IEnumerable<Book> books2 = ctx.Books.Where(b => b.Price > 80);
foreach (Book book in books2)
{Console.WriteLine($"Id={book.Id},Title={book.Title},Price={book.Price}");
}//查询单条数据,如果找不到则会报错
Book b1 = ctx.Books.Single(b=>b.Title=="零基础趣学C语言");
Console.WriteLine(b1.Title);//查询单条数据,找不到返回null
Book? b2 = ctx.Books.FirstOrDefault(b=>b.Id==9);
if(b2 == null)
{Console.WriteLine("没有ID为9的数据");
}
else
{Console.WriteLine(b2.Title);
}//按照价格排序
IEnumerable<Book> books = ctx.Books.OrderByDescending(b => b.Price);
foreach(Book book in books)
{Console.WriteLine($"Id={book.Id},Title={book.Title},Price={book.Price}");
}

 3. 修改

using efCore;
using TestDbContext ctx = new TestDbContext();Book? b1 = ctx.Books.FirstOrDefault(b => b.Title == "数学之美");
if (b1 != null)
{b1.AuthorName = "张三";
}
await ctx.SaveChangesAsync();

4. 删除

using efCore;
using TestDbContext ctx = new TestDbContext();Book? b1 = ctx.Books.FirstOrDefault(b => b.Title == "数学之美");
if (b1 != null)
{ctx.Remove(b1);
}
await ctx.SaveChangesAsync();

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易语言 -- 开山篇章

易语言简介 易语言(EPL)是一门以中文作为程序代码的编程语言,其以“易”著称,创始人为吴涛。易语言早期版本的名字为 E 语言,也通常代指与之对应的集成开发环境。其最早的版本发布可追溯至 2000 年 9 月 11 日。创造易语言的初衷是进行用中文来编写程序的实践,方便中国人…

《ESP32-S3使用指南—IDF版 V1.6》第八章 MENUCONFIG菜单配置

第八章 MENUCONFIG菜单配置 1)实验平台:正点原子DNESP32S3开发板 2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6 3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/es…

已安装TortoiseGit,但是文件夹不显示相关图标

问题原因:注册表图标显示太靠后了,只有前15个生效,排序该前就行项目文件夹右键->settings->Overlay Handlers->Start register editor->一下文件重命名,前面多加点空格,保证排名在前面就行->任务栏右键任务管理器->Windows资源管理器->右键重新启动-…

用一个静态图片实现出怪路线提示

用一个静态图片实现下面的效果

Windows平台调试器原理与编写01.调试框架

调试器原理与编写01.调试框架-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 调试框架 调试器最基本功能: 断点,单步 断点分为三类软件断点 硬件断点 内存断点window提供了一套机制,帮助用户来实现一套3环的调试器 事件驱动 : 窗口的各种操作(外在的想要对窗…

本地部署DeepSeek-R1-AWQ

一、部署环境准备 系统信息:主机名为 10-200-3-23 IP 地址为 10.200.3.23 操作系统为 ubuntu 22.04 配备 8 卡 A100。二、驱动与桥接器安装安装 gcc执行命令 apt-get update -y apt install build-essential -y安装驱动下载驱动 wget https://us.download.nvidia.com/tesla/…

k8s部署nfs+sc

1.下载软件包nfs-subdir-external-provisioner-4.0.18.tgz 该软件包内文件截图 修改values.yaml 在目录内执行 helm install nfs-provisioner -f values.yaml . #老重要了2.查看执行是否成功 3.测试是否成功 编写yaml apiVersion: v1kind: PersistentVolumeClaimmetadata…

P2661 [NOIP 2015 提高组] 信息传递——染色做法

原题 本来想当水题刷的,结果被水题刷了。。。70到80到90到100,必须写个题解记录一下(doge) 题目分析一句话:求一个无权有向图中的最短环路(确保有环) tip:每一个点出度为一,那么必然有环,以样例为例如下。思路没必要每轮模拟全部的传送,只看某一个人的传送过程: 就…

有哪些好用的AI工具?(你想要的AI工具都在这)

1. 常见应用场景 1.1. 国内通用大模型模型名称 简介 官网地址DeepSeek 深度求索公司研发的高性能开源模型,以低成本、高推理能力著称,支持数学、代码等复杂任务。 https://chat.deepseek.com/豆包 字节跳动开发的智能语言模型,基于深度学习技术,支持多种自然语言处理任务。…

Kubernetes 集群上部署 Open WebUI

在前一篇博文中记录了 k8s 集群上部署 ollama + deepseek-r1:7b,这篇博文记录一下 Open WebUI 的部署。还是用 helm 部署,添加 open-webui 的 helm repo,准备 helm 清单文件,通过 helm 命令在 ai 命名空间下进行部署在前一篇博文中记录了 k8s 集群上部署 ollama + deepseek…

2025.2.22

Hehe_0 模拟赛内容随笔 [NOIP2015]金币1 2 3 4 。。。1 2-3 4-6 7-10 。。。观察数据范围1e4,暴力就行,然后可以去思考优化版本 由于已经把规律给出来了,所以可以提前离线处理出来,如果数据过大,可以预处理每一次金币变化的天数,然后根据提问二分找区间然后求和。这种数…

充电桩功能扩展,解决桩企内存不足的问题

OCPP(开放充电点协议)1.6是电动汽车充电基础设施中广泛使用的通信标准。尽管OCPP 1.6为充电桩与中央管理系统(CSMS)之间的交互提供了基本功能,但由于OCPP主板的内存资源有限,其能够实现的功能也受到了一定的限制。为了解决这一问题,OCPP协议网关作为OCPP主板的扩展,能够…