.net 6.0 框架集成ef实战,步骤详解

一、代码框架搭建

搭建如下代码架构:

重点含EntityFrameworkCore工程,该工程中包含AppDbContext.cs和数据表实体AggregateObject

 1、AppDbContext 代码案例

//AppDbContext 代码案例using Microsoft.EntityFrameworkCore;namespace EntityFrameworkCore
{public class AppDbContext : DbContext{public AppDbContext(DbContextOptions<AppDbContext> options) : base(options){}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);// 增加以下代码配置modelBuilder.ConfigDatabaseDescription();}public DbSet<CFUserAggregate> CFUserAggregate { get; set; } // 示例:User 是你的实体类// 添加其他 DbSet<T> 来表示其他数据表}}

2、实体案例 

1)AggregateRootBase类:

     存放表公共字段,例状态、创建时间等 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;namespace EntityFrameworkCore
{public abstract class AggregateRootBase{[Key] // 主键[StringLength(36)] // 字符串长度限制[DbDescription("主键ID")]public Guid? Id { get; set; }[StringLength(36)][DbDescription("创建人ID")]public Guid? CreateUserGuid { get; set; }[Required][DbDescription("创建时间")]public DateTime? CreateDateTime { get; set; }[StringLength(36)][DbDescription("修改人ID")]public Guid? ModifyUserGuid { get; set; }[DbDescription("修改时间")]public DateTime? ModifyDateTime { get; set; }}
}

2)CFUserAggregate 实体 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;namespace EntityFrameworkCore
{[Table("CF_User")][DbDescription("用户表")]public class CFUserAggregate : AggregateRootBase{[Required][StringLength(15)] // 字符串长度限制[DbDescription("登录人手机号码")]public string PhoneNumber { get; set; }[Required][StringLength(100)] // 字符串长度限制[DbDescription("登录密码")]public string Password { get; set; }[Required][StringLength(10)][DbDescription("状态: New:新增;Active:有效;InActive:无效/注销")]public string? RecordStatus { get; set; }}}

二、引入EF依赖

具体步骤:

三、配置数据库连接

appsettings.json文件中配置数据库访问链接

四、注册 AppDbContext 作为服务

具体代码:

#region 注册 AppDbContext 作为服务
// 添加数据库上下文服务
//builder.Services.AddDbContext<AppDbContext>(options =>
//{
//    var connectionString = builder.Configuration.GetConnectionString("MySqlConnection");//    options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString));
//});builder.Services.AddDbContext<AppDbContext>(optionsAction:   x =>{x.UseMySql( builder.Configuration.GetConnectionString("MySqlConnection"), new MySqlServerVersion(new Version(8, 0, 23)));});
//这段代码是使用.NET Core(或.NET框架)中的依赖注入(Dependency Injection)功能。
//在这里,AddScoped 是指将服务注册为“作用域”生命周期,
//表示每次 HTTP 请求时都会创建一个新的实例,但在同一个请求内的所有地方都会共享同一个实例。
builder.Services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
//builder.Services.AddScoped<RegisterServices>(); // 注册 YourService 类 参考案例
#endregion

五、将实体表更新到数据库中

在程序包管理器控制台执行下面的命令

//执行下面的命令生产待执行到数据库中的类文件
Add-Migration CF_User20240508//更新到数据库中
Update-Database 

命令执行成功之后会产生相关类文件

命令执行成功之后会在数据库中产生对应表

六、在控制器中通过表实体访问数据库

七、拓展1:实体字段描述更新到数据库字段说明

1、将实体字段描述更新到数据库字段说明中,如下效果

SELECT COLUMN_NAME, COLUMN_COMMENT 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = '数据库名称' AND TABLE_NAME = '表名';

2、具体实现步骤

1)DbDescriptionAttribute 类: 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace EntityFrameworkCore
{//// 摘要://     实体在数据库中的表和列的说明 在迁移的Up方法中调用(确保在所有表创建和修改完成后,避免找不到表和列)[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Property | AttributeTargets.Field, Inherited = true, AllowMultiple = false)]public class DbDescriptionAttribute : Attribute{//// 摘要://     说明public virtual string Description{get;}//// 摘要://     初始化新的实例//// 参数://   description://     说明内容public DbDescriptionAttribute(string description){Description = description;}}
}

2)MigrationBuilderExtensions类: 

using JetBrains.Annotations;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Migrations.Operations;
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
using Microsoft.EntityFrameworkCore.Utilities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
using System;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using Microsoft.EntityFrameworkCore;namespace EntityFrameworkCore
{/// <summary>/// 表实体中表名、字段加字段说明/// </summary>public static class MigrationBuilderExtensions{public static void AddOrUpdateTableDescription(this MigrationBuilder migrationBuilder, string tableName, string description, string schema = "dbo"){if (!string.IsNullOrEmpty(description) && description.Contains('\'')){description = description.Replace("'", "''");}migrationBuilder.Sql("ALTER TABLE {tableName} COMMENT '{tableDescription}';".Replace("{tableDescription}", description).Replace("{schema}", schema).Replace("{tableName}", tableName));}public static void AddOrUpdateColumnDescription(this MigrationBuilder migrationBuilder, string tableName, string columnName, string columnType, bool isNullable, string description, string schema = "dbo"){Console.WriteLine(description);if (!string.IsNullOrEmpty(description) && description.Contains('\'')){description = description.Replace("'", "''");}migrationBuilder.Sql("ALTER TABLE {tableName} MODIFY COLUMN {columnName} {columnType} {isNullable} COMMENT '{columnDescription}';".Replace("{columnDescription}", description).Replace("{schema}", schema).Replace("{tableName}", tableName).Replace("{columnName}", columnName).Replace("{columnType}", columnType).Replace("{isNullable}", isNullable == true ? "" : " NOT NULL "));}public static MigrationBuilder ApplyDatabaseDescription(this MigrationBuilder migrationBuilder, Microsoft.EntityFrameworkCore.Migrations.Migration migration){string text = "dbo";string name = "DbDescription";foreach (var entityType in migration.TargetModel.GetEntityTypes()){string tableName = entityType.GetTableName();string schema = entityType.GetSchema();Console.WriteLine("tableName:" + tableName);Console.WriteLine("schema:" + schema);IAnnotation annotation = entityType.FindAnnotation(name);if (annotation != null){Console.WriteLine("annotation.Value:" + annotation.Value.ToString());migrationBuilder.AddOrUpdateTableDescription(tableName, annotation.Value.ToString(), string.IsNullOrEmpty(schema) ? text : schema);}foreach (var property in entityType.GetProperties()){IAnnotation annotation2 = property.FindAnnotation(name);if (annotation2 != null){migrationBuilder.AddOrUpdateColumnDescription(tableName, property.GetColumnName(), property.GetColumnType(), property.IsNullable, annotation2.Value.ToString(), string.IsNullOrEmpty(schema) ? text : schema);}}}return migrationBuilder;}}
}

 3)ModelBuilderExtensions类:

using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Reflection;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;namespace EntityFrameworkCore
{public static class ModelBuilderExtensions{// 自定义方法,用于将描述信息应用到数据库中public static ModelBuilder ConfigDatabaseDescription(this ModelBuilder modelBuilder){foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes()){if (entityType.FindAnnotation("DbDescription") == null && (entityType.ClrType?.CustomAttributes.Any((CustomAttributeData attr) => attr.AttributeType == typeof(DbDescriptionAttribute)) ?? false)){entityType.AddAnnotation("DbDescription", (entityType.ClrType.GetCustomAttribute(typeof(DbDescriptionAttribute)) as DbDescriptionAttribute)?.Description);}foreach (IMutableProperty property in entityType.GetProperties()){if (property.FindAnnotation("DbDescription") != null || !(property.PropertyInfo?.CustomAttributes.Any((CustomAttributeData attr) => attr.AttributeType == typeof(DbDescriptionAttribute)) ?? false)){continue;}PropertyInfo propertyInfo = property.PropertyInfo;Type type = propertyInfo?.PropertyType;property.AddAnnotation("DbDescription", (propertyInfo.GetCustomAttribute(typeof(DbDescriptionAttribute)) as DbDescriptionAttribute)?.Description);}}return modelBuilder;}}}

 4)在第5步执行完毕之后,在生成的文件中添加如下代码:

 migrationBuilder.ApplyDatabaseDescription(this);

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

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

相关文章

OGG几何内核-网格化的改进

OGG社区于4月19日发布了OGG 1.0 preview版本。相对于OCCT 7.7.0有很多改进&#xff0c;目前在持续研究中。最近测试了一下网格化&#xff0c;确实有很好的改进。对比展示如下&#xff1a; 几何内核&#xff1a; OGG 1.0 preview 几何内核&#xff1a;OCCT 7.7.0 采用OCCT几何内…

栈与队列的实现

前言 本次博客将要实现一下栈和队列&#xff0c;好吧 他们两个既可以使用动态数组也可以使用链表来实现 本次会有详细的讲解 栈的实现 栈的基础知识 什么是栈呢&#xff1f; 栈的性质是后进先出 来画个图来理解 当然可不可以出一个进一个呢&#xff0c;当然可以了 比如…

BGP基础

1.BGP概述 &#xff08;1&#xff09;AS IANA&#xff08;Internet Assigned Numbers Authority&#xff0c;因特网地址分配组织&#xff09;&#xff1a;IAB&#xff08;Internet Architecture Board&#xff0c;因特网体系委员会&#xff09;的下设组织。IANA授权NIC&#x…

Web前端一套全部清晰 ⑧ day5 CSS.3 选择器、PxCook软件、盒子模型

谁不是一路荆棘而过呢 —— 24.5.12 CSS.3 选择器、PxCook软件、盒子模型 一、选择器 1.结构伪类选择器 1.作用: 根据元素的结构关系查找元素。 选择器 说明 E:first-child 查找第一个 E元素 E:last-child 查找最后一个E元素 E:nth-chil…

系统权限控制插件封装-实现系统权限控制插件化

背景&#xff1a;按照传统的开发方式方式&#xff0c;每次新开发一个系统&#xff0c;就需要花费大量时间精力去搭建权限控制模块&#xff0c;如果我们把权限控制这一整个模块都抽离成一个独立的权限控制插件&#xff0c;支持单命令安装&#xff0c;全面暴露参数与方法&#xf…

OpenCV下载安装教程(Windows)

一、什么是OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个广泛使用的开源计算机视觉库&#xff0c;旨在提供丰富的图像和视频处理功能。它最初由Intel于1999年开发&#xff0c;并演变成为一个全球性的开源项目&#xff0c;得到了众多开发者…

K8s源码分析(二)-K8s调度队列介绍

本文首发在个人博客上&#xff0c;欢迎来踩&#xff01; 本次分析参考的K8s版本是 文章目录 调度队列简介调度队列源代码分析队列初始化QueuedPodInfo元素介绍ActiveQ源代码介绍UnschedulableQ源代码介绍**BackoffQ**源代码介绍队列弹出待调度的Pod队列增加新的待调度的Podpod调…

cmd输入mysql -u root -p无法启动

问题分析&#xff1a;cmd输入mysql -u root -p无法启动 解决方法&#xff1a;配置系统环境变量 1.找到mysql安装文件下的bin文件&#xff1a;&#xff08;复制改文件地址,如下图所示&#xff09; 2.电脑桌面下方直接搜索环境变量并进入&#xff0c;如下图 3.点击环境变量&a…

Python 中的 Lambda 函数:简单、快速、高效

大家好&#xff0c;今天再给大家介绍一个python的一个强大工具Lambda 函数&#xff0c;它允许你快速定义简单的匿名函数。这种函数是“匿名的”&#xff0c;因为它们不需要像常规函数那样被明确命名。 在本文中&#xff0c;我们将通过清晰的解释和实用的示例&#xff0c;深入了…

GoF之代理模式(静态代理+动态代理(JDK动态代理+CGLIB动态代理带有一步一步详细步骤))

1. GoF之代理模式&#xff08;静态代理动态代理(JDK动态代理CGLIB动态代理带有一步一步详细步骤)&#xff09; 文章目录 1. GoF之代理模式&#xff08;静态代理动态代理(JDK动态代理CGLIB动态代理带有一步一步详细步骤)&#xff09;每博一文案2. 代理模式的理解3. 静态代理4. 动…

打印图形(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i, j;//循环打印&#xff1b;for (i 0; i < 5; i){//列&#xff1b;for (j 0; j &…

网络端口占用问题的综合调研与解决方案

原创 Randy 拍码场 问题背景 去年底信息安全团队进行网络权限治理&#xff0c;要求所有应用实例使用静态IP&#xff0c;公网访问策略与静态IP绑定&#xff1b;之后实例重启时偶现“端口被占用”错误。通过分析总结应用日志&#xff0c;共有以下4种错误类型&#xff0c;实质都是…

1-02-02:虚拟化与容器化Docker环境搭建

1.02.02 虚拟化与容器化Docker环境搭建 一. 虚拟化与容器化技术简介1. 虚拟机环境2. docker环境 二. Docker 架构与隔离机制2.1 Docker 架构2.2 Docker 隔离机制2.3 资源限制2.4 Docker应用场景 三. 实战:Docker在Centos7安装与镜像加速 ❤❤❤3.1 docker安装3.2 设置镜像加速 …

AI回答总不满意?你的提问方式可能完全错误!

大家好&#xff0c;我是卷福同学&#xff0c;一个专注AI大模型整活的前阿里程序员&#xff0c;腾讯云社区2023新秀突破作者 向AI提问想写一篇论文&#xff0c;结果AI就生成2000字左右的文章后就完了。小伙伴们是不是也会遇到这类情况呢。今天来教大家AI提示词的技巧&#xff0c…

Kubernetes基础理论介绍

前言 随着企业数字化转型的深入&#xff0c;为云而生的云原生架构和思想已被大量企业所接受。容器云、微服务、DevOps、 Serverless 已成为企业落地云原生的关键技术&#xff0c;而 Kubernetes 作为容器云的核心基础和事实标准&#xff0c;已成为当今互联网企业和传统 IT 企业…

DHCP原理

什么是DHCP DHCP (Dynamic Host Configuration Protocol,动态主机配置协议&#xff09;是由Internet工作任务小组设计开发的&#xff0c;专门用于为TCP/IP网络中的计算机自动分配TCP/IP参数的协议&#xff0c;是一个应用层协议&#xff0c;使用UDP的67和68端口。 DHCP的前身是B…

发布GPT-5的方式可能会与以往不同;开源vocode使用 AI 自动拨打电话;开源gpt智能对话客服工具;AI自动写提示词

✨ 1: vocode 用AI通过声音与用户进行实时交流 Vocode是一个旨在帮助开发者快速构建基于声音的大型语言模型&#xff08;LLM&#xff09;应用程序的开源库。简单来说&#xff0c;如果你想要开发一个能够通过声音与用户进行实时交流的应用&#xff0c;比如电话机器人、语音助手…

一套MySQL读写分离分库分表的架构,被秀到了!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

FFmpeg 音视频处理工具三剑客(ffmpeg、ffprobe、ffplay)

【导读】FFmpeg 是一个完整的跨平台音视频解决方案&#xff0c;它可以用于音频和视频的转码、转封装、转推流、录制、流化处理等应用场景。FFmpeg 在音视频领域享有盛誉&#xff0c;号称音视频界的瑞士军刀。同时&#xff0c;FFmpeg 有三大利器是我们应该清楚的&#xff0c;它们…

HNU-操作系统OS-2024期中考试

前言 该卷为22计科/智能OS期中考卷。 感谢智能22毕宿同学记忆了考卷考题。 同学评价&#xff1a;总体简单&#xff1b;第1&#xff0c;7概念题较难需要看书&#xff1b;第4&#xff0c;5题原题。 欢迎同学分享答案。 【1】共10分 操作系统的设计目标有哪些&#xff1f; 【…