当前位置: 首页 > 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…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...