当前位置: 首页 > news >正文

Backend - EF Core(C# 操作数据库 DB)

目录

一、EF Core

1. 使用的ORM框架(对象关系映射)

2. EFCore 常见两种模式

3. EFCore 提供程序

二、 EF 操作数据库(Code First)

1. 下载NuGet插件

2.创建模型类文件

3.创建DBContext文件

4.Programs.cs文件

5.appsettings.Development.json文件

三、DBContext文件的基础设置

(一)表名和栏位名都大写

(二)布尔值栏位的存储

1.DBContext文件的内容:

2.测试的Controller文件(配合Swagger):

四、EF 执行迁移

五、根据数据库生成Model类(DB First)

1. 安装 EF Core Power Tools 插件

2. 使用 EF Core Power Tools 插件生成模型类

3. 补充

4. 所需插件如图所示

六、EF 仓储模式(类似于Django的ORM)

1. 创建Postgre仓储类

2.Programs.cs


一、EF Core

1. 使用的ORM框架(对象关系映射)

        可理解为将数据库作为对象来进行操作。

2. EFCore 常见两种模式

        DBFirst(数据库优先)、CodeFirst(代码优先)

3. EFCore 提供程序

        安装程序:右击整个方案(而不是单个专案) > 选择“管理方案的NuFet套件” > 浏览选项卡下,搜索所需程序 > 选中需要安装的专案 > 点击安装 > 弹出的提示框选择套用和接受。

二、 EF 操作数据库(Code First)

1. 下载NuGet插件

Microsoft.AspNetCore.App

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameWorkCore.Tools (针对数据库迁移)

Microsoft.EntityFrameworkCore.Design(设计库,数据库转为ORM)

Npgsql

Npgsql.EntityFrameworkCore.PostgreSQL (针对PostgreSQL数据库)

2.创建模型类文件

using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;namespace ASPNetAPI.Models
{[Table("myapp_music")][Index(nameof(MusicName))] // 单个索引[Index(nameof(MusicName), nameof(Singer), IsUnique = true)] // 联合索引public class Music{[Key] // 每个表必须存在主键(要么是设置Key属性、要么栏位后缀是ID)[Column("music_id")]public int MusicID {  get; set; }[Display(Name = "歌名")][Required(ErrorMessage ="请输入歌名")][Column("music_name")]public string MusicName { get; set; }[MaxLength(50, ErrorMessage = "描述内容不超过50个字符")][Required(ErrorMessage = "请输入歌曲说明")][Column("desc")]public string Description { get; set; }[Required(ErrorMessage = "请选择歌手")][Column("singer")]public MusicSingersEnum? Singer { get; set; }[Column("playtimes")]public int PlayTimes { get; set; }[Column("price")]public double SongPrice { get; set; }}
}

3.创建DBContext文件

using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Repository.Music.Models;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;namespace ASPNetAPI.Context; // 命名空间public class MusicDbContext : DbContext // 继承DbContext
{public MusicDbContext(DbContextOptions<MusicDbContext> options): base(options) // 实例化DbContextOptions{}public virtual DbSet<Music> Music { get; set; } // 对DbContext类的所有实体,添加DbSet<TEntity泛型> 属性。protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)//=> optionsBuilder.UseNpgsql("DATA SOURCE=XX.XX.XXX.X;PASSWORD=123;PERSIST SECURITY INFO=True;USER ID=luobogan");=> optionsBuilder.UseOracle("User Id = luobogan; Password=123;Data Source = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = XX.XX.XXX.X)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = Book)))");protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);foreach (var entity in modelBuilder.Model.GetEntityTypes()) // 遍历所有实体类型{entity.SetTableName(entity.GetTableName().ToUpper()); // 表名大写foreach (var property in entity.GetProperties()){// 针对属性的列类型是布尔值,进行修改if (property.ClrType == typeof(bool)){// 设置 ValueConverter,将数据库中bool类型的列值与代码中char字符值自动转换(数据库中存储 'T' / 'F',ORM操作的是True/False)property.SetValueConverter(new ValueConverter<bool, string>(v => v ? "T" : "F", // 将 bool 转换为字符('T' 或 'F')v => v == "T" // 将 字符 转换为 bool('T' 转换为 True,其他为 False)));// 更新列类型为 string(如 CHAR(1) 或 VARCHAR(1))property.SetColumnType("CHAR(1)"); }property.SetColumnName(property.GetColumnName().ToUpper()); // 列名大写}}}
}

4.Programs.cs文件

using Microsoft.EntityFrameworkCore;
using ASPNetAPI.Models;
…
builder.Services.AddDbContextPool<MusicDbContext>(options => options.UseNpgsql(builder.Configuration.GetConnectionString("MusicConn")) // 针对的是postgreDB);

5.appsettings.Development.json文件

{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"ConnectionStrings": {"MusicConn": "Host=10.XXX.XX.XX;Database=music_db;User Id=luobogan;Password=luobo.123;"}
}

三、DBContext文件的基础设置

(一)表名和栏位名都大写

protected override void OnModelCreating(ModelBuilder modelBuilder)
{base.OnModelCreating(modelBuilder);// 遍历所有实体类型foreach (var entity in modelBuilder.Model.GetEntityTypes()){          // 表名大写entity.SetTableName(entity.GetTableName().ToUpper());foreach (var property in entity.GetProperties()){// 所有列名大写property.SetColumnName(property.GetColumnName().ToUpper());}}
}

(二)布尔值栏位的存储

1.DBContext文件的内容:

using Microsoft.EntityFrameworkCore.Storage.ValueConversion;protected override void OnModelCreating(ModelBuilder modelBuilder)
{base.OnModelCreating(modelBuilder);// 遍历所有实体类型foreach (var entity in modelBuilder.Model.GetEntityTypes()){   foreach (var property in entity.GetProperties()){// 针对属性的列类型是布尔值,进行修改if (property.ClrType == typeof(bool)){// 设置 ValueConverter,将数据库中bool类型的列值与代码中char字符值自动转换(数据库中存储 'T' / 'F',ORM操作的是True/False)property.SetValueConverter(new ValueConverter<bool, string>(v => v ? "T" : "F", // 将 bool 转换为字符('T' 或 'F')v => v == "T" // 将 字符 转换为 bool('T' 转换为 True,其他为 False)));// 更新列类型为 string(如 CHAR(1) 或 VARCHAR(1))property.SetColumnType("CHAR(1)"); }}}
}

2.测试的Controller文件(配合Swagger):

using Microsoft.AspNetCore.Mvc;
using System.Data;
using Api.Models.Response;
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading.Tasks;
using Repository.mes.Models;
using Repository.mes.Context;
using System.Linq;namespace Api.Controllers
{[ApiController]   [Route("api/[controller]")]public class TestBoolController(MusicContext context) : @base.BaseController(){private readonly MusicContext _context = context;[HttpGet][DisplayName("【查詢】布尔值测试")]public async Task<ActionResult<ResponseDto<IEnumerable<MusicSuperUser>>>> Get(){var music_qry = _context.MusicSuperUsers.AsQueryable();var res_qry = music_qry.Select(m => new{m.Active,m.Freeze,m.Createuser}).ToList();var get_act = res_qry[0].Active;if (get_act){return Ok(message: "这是True值:" + get_act);}return Ok(message: "这是False值"+ get_act);}}
}

四、EF 执行迁移

可参考另一篇文章:Backend - EF Core 执行迁移 Migrate-CSDN博客

五、根据数据库生成Model类(DB First)

采用EFCore逆向工具生成实体类。

模型类属性的设定有两种(DataAnnotation注解、FluentAPI)。

以下工具主要以DataAnnotation注解的形式实现。即,根据数据库的表,自动生成 C# 模型类,并将数据库的栏位属性,自动添加到对应模型类上的注解。

1. 安装 EF Core Power Tools 插件

打开VS > 延伸扩展 > 管理延伸扩展 > 搜索并安装 EF Core Power Tools(下载好后,需关闭VS才能安装。安装后,重启 VS)

2. 使用 EF Core Power Tools 插件生成模型类

右击专案,选择 EF Core Power Tools -> Reverse Engineer(反向工程)> 弹出的对话框中,选择数据库连接(也可自定义数据库,点击新增,根据需求选择数据库来源和输入数据库信息)> 点击确定后,新的对话框中选择要导出的表> 设定基础信息(DBContext名称等) > 勾选 Use DataAnnotation > 如有更多需求,可点击“进阶”> 点击确定,稍等几分钟。

3. 补充

若上述的选择数据库来源时,找不到想要的数据库来源,则需安装数据库对应的驱动(如postgre需要在NuGet中安装 Npgsql PostgreSQL Integration 插件)。

4. 所需插件如图所示

具体操作可参考另一篇文章:Backend - EF Core Power Tools(C# EFCore逆向工具)-CSDN博客

六、EF 仓储模式(类似于Django的ORM)

1. 创建Postgre仓储类

using System;
using System.Collections.Generic;namespace ASPNetAPI.Models
{public class PostgreMusicRepository : IMusicRepository{private readonly MusicDbContext _context;public PostgreMusicRepository(MusicDbContext context){this._context = context;}public Music CreateSong(Music music){_context.Music.Add(music);_context.SaveChanges();return music;}public Music DeleteSong(int id){Music music = _context.Music.Find(id);if (music != null){_context.Music.Remove(music);_context.SaveChanges();}return music;}public IEnumerable<Music> GetAllSongs(){return _context.Music;}public Music GetSong(int id){return _context.Music.Find(id);}public Music UpdateSong(Music updateMusic){var music = _context.Music.Attach(updateMusic);music.State = Microsoft.EntityFrameworkCore.EntityState.Modified;_context.SaveChanges();return updateMusic;}}
}

2.Programs.cs

using Microsoft.EntityFrameworkCore;
using ASPNetAPI.Models;
…
builder.Services.AddScoped<IMusicRepository, PostgreMusicRepository>();  

相关文章:

Backend - EF Core(C# 操作数据库 DB)

目录 一、EF Core 1. 使用的ORM框架&#xff08;对象关系映射&#xff09; 2. EFCore 常见两种模式 3. EFCore 提供程序 二、 EF 操作数据库&#xff08;Code First&#xff09; 1. 下载NuGet插件 2.创建模型类文件 3.创建DBContext文件 4.Programs.cs文件 5.appsettings.Devel…...

WebSocket 性能优化:从理论到实践

在前四篇文章中,我们深入探讨了 WebSocket 的基础原理、服务端开发、客户端实现和安全实践。今天,让我们把重点放在性能优化上,看看如何构建一个高性能的 WebSocket 应用。我曾在一个直播平台项目中,通过一系列优化措施,将单台服务器的并发连接数从 1 万提升到 10 万。 性能挑…...

我用AI学Android Jetpack Compose之入门篇(2)

我跑成功了第一个Compose应用&#xff0c;但我还是有很多疑问&#xff0c;请人工智能来解释一下吧。答案来自 通义千问 文章目录 1.请解释一下Compose项目的目录结构。根目录模块目录&#xff08;通常是app&#xff09;app/build.gradleapp/src/mainapp/src/main/uiapp/src/ma…...

以太网协议在汽车应用中的动与静

为了让网络中的设备能够随时或随地接入网络或离开网络&#xff0c;做到&#xff1a;接入时无需多余的配置就能和其他设备互相通信&#xff1b;离开时又不会导致设备或网络崩溃。以太网从物理层到协议层展现出多方面的灵活性&#xff0c;&#xff0c;使其成为连接各种设备和系统…...

【C语言】_指针与数组

目录 1. 数组名的含义 1.1 数组名与数组首元素的地址的联系 1.3 数组名与首元素地址相异的情况 2. 使用指针访问数组 3. 一维数组传参的本质 3.1 代码示例1&#xff1a;函数体内计算sz&#xff08;sz不作实参传递&#xff09; 3.2 代码示例2&#xff1a;sz作为实参传递 3…...

Selenium 的四种等待方式及使用场景

Selenium 的四种等待方式及使用场景 隐式等待&#xff08;Implicit Wait&#xff09;显式等待&#xff08;Explicit Wait&#xff09;自定义等待&#xff08;Custom Wait&#xff09;固定等待&#xff08;Sleep&#xff09; 1. 隐式等待 定义&#xff1a; 隐式等待是为 WebD…...

React知识盲点——组件通信、性能优化、高级功能详解(大纲)

组件通信 React 组件通信详解 在 React 中&#xff0c;组件通信是一个核心概念&#xff0c;主要指的是如何让不同的组件共享和传递数据。React 提供了多种机制来实现组件间的数据传递和状态共享。以下是几种常见的组件通信方式&#xff0c;包括&#xff1a;父子组件通信&…...

Vue 按键生成多个表单

本文通过 vueele&#xff0c;通过循环ref的方法生成多个表单,代码如下&#xff1a; <template><div><el-button click"addText" style"margin: 15px 0; ">添加字段</el-button><div v-for"item, index in dataList"…...

网络安全:交换机技术

单播&#xff0c;组播广播 单播(unicast): 是指封包在计算机网络的传输中&#xff0c;目的地址为单一目标的一种传输方式。它是现今网络应用最为广泛&#xff0c;通常所使用的网络协议或服务大多采用单播传输&#xff0c;例如一切基于TCP的协议。组播(multicast): 也叫多播&am…...

Flask 快速入门

1. Flask 简介 1.1 什么是 Flask Flask 是一个用 Python 编写的轻量级 Web 框架&#xff0c;被誉为 微框架。它提供基础功能&#xff0c;如路由、请求处理和模板引擎&#xff0c;但不强迫开发者使用特定库或工具&#xff0c;赋予开发人员高度的自由选择权&#xff0c;以满足不…...

C#设计模式(行为型模式):备忘录模式,时光倒流的魔法

C#设计模式&#xff1a;备忘录模式&#xff0c;时光倒流的魔法 在软件开发中&#xff0c;我们经常会遇到需要保存对象状态&#xff0c;并在未来某个时刻恢复的场景。例如&#xff1a; 撤销操作&#xff1a; 文本编辑器中的撤销功能&#xff0c;游戏中的回退操作。事务回滚&am…...

数据库高安全—角色权限:权限管理权限检查

目录 3.3 权限管理 3.4 权限检查 书接上文数据库高安全—角色权限&#xff1a;角色创建角色管理&#xff0c;从角色创建和角色管理两方面对高斯数据库的角色权限进行了介绍&#xff0c;本篇将从权限管理和权限检查方面继续解读高斯数据库的角色权限。 3.3 权限管理 &#x…...

FastAPI 的依赖注入与生命周期管理深度解析

FastAPI 的依赖注入与生命周期管理深度解析 目录 &#x1f527; 依赖注入与 FastAPI 高级特性 1.1 依赖注入的基础与核心概念1.2 FastAPI 的依赖注入机制与设计理念1.3 FastAPI 依赖注入的异步特性 &#x1f579; 生命周期与依赖的异步管理 2.1 依赖的生命周期管理&#xff1…...

【express-generator】05-路由中间件和错误处理(第一阶段收尾)

一、前言 上篇文章我们介绍了express-generator的请求体解析&#xff0c;重点讲了常用的请求体数据格式&#xff08;JSON/URL 编码的表单数据&#xff09;以及一个FILE文件上传&#xff0c;同时搭配代码示范进行辅助理解。 二、本篇重点 我们继续第一阶段的知识&#xff0c;…...

Linux环境下确认并操作 Git 仓库

在软件开发和版本控制中&#xff0c;Git 已成为不可或缺的工具。有时&#xff0c;我们需要确认某个目录是否是一个 Git 仓库&#xff0c;并在该目录中运行脚本。本文将详细介绍如何确认 /usr/local/src/zcxt/backend/policy-system-backend 目录是否是一个 Git 仓库&#xff0c…...

UDP -- 简易聊天室

目录 gitee&#xff08;内有详细代码&#xff09; 图解 MessageRoute.hpp UdpClient.hpp UdpServer.hpp Main.hpp 运行结果&#xff08;本地通信&#xff09; 如何分开对话显示&#xff1f; gitee&#xff08;内有详细代码&#xff09; chat_room zihuixie/Linux_Lear…...

NVIDIA在CES 2025上的三大亮点:AI芯片、机器人与自动驾驶、全新游戏显卡

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

【通俗理解】AI的两次寒冬:从感知机困局到深度学习前夜

AI的两次寒冬&#xff1a;从感知机困局到深度学习前夜 引用&#xff08;中英双语&#xff09; 中文&#xff1a; “第一次AI寒冬&#xff0c;是因为感知机局限性被揭示&#xff0c;让人们失去了对算法可行性的信心。” “第二次AI寒冬&#xff0c;则是因为专家系统的局限性和硬…...

transformer深度学习实战CCTSDB中国交通标志识别

本文采用RT-DETR作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。RT-DETR以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对CCTSDB交通标志数据集进行训练和优化&#xff0c;该数据集包含丰富的CCTSDB交…...

JavaWeb开发(六)XML介绍

1. XML介绍 1.1. 什么是XML &#xff08;1&#xff09;XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种很像HTML的标记语言。   &#xff08;2&#xff09;XML 的设计宗旨是传输数据(目前主要是作为配置文件)&#xff0c;而不是显示数据。   &#xff08;3&a…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...