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

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...