首页 > 数据库 >Net Core中使用EF Core连接Mysql数据库

Net Core中使用EF Core连接Mysql数据库

时间:2024-01-24 18:12:02浏览次数:30  
标签:Core MyDbContext 数据库 EF db Mysql Study Id

Entity Framework Core的前身是微软提供并主推的ORM框架,简称EF,其底层是对ADO.NET的封装。EF支持SQLServer、MYSQL、Oracle、Sqlite等所有主流数据库。
首先是使用时的几个模式的整理及其理解:

  1. Code First:根据代码自动创建数据库表结构甚至是数据库,可以支持多库开发,代码较少冗余,由于会自动更改数据库,如果有在实体类中自定义了字段,不希望在数据库中创建此字段(有时偷懒,不想定义ViewModel会这样做),还需要自己实现单独的生成代码。这就复杂了。
  2. DB First:根据现有的数据库结构生成模型类或实体类,这种适合数据库结构比较稳定的产品,数据库结构较大,表较多,甚至多人开发时频繁变动各自都要去生成太容易出错。同样偷懒模式下会删除字段。
  3. Model First:这种有可视化的模型设计,也就是Edm文件,可以利用VS等工具快速生成数据库脚本,类似Code Fist,只不过能可视化编写模式,需要完全了解数据库结构,貌似现在的NET Core时代没有这玩意了。
  4. 灵活的模式:这个算是我自加的,我称之为灵活的模式,就是DB和Code分开来实现,可以由不同的人来协作完成,更适合团队协作,DB由A来完成,Code由B来完成,甚至更多的人来参与,当然这个也会有一个大问题就是可能实体Code和DB不能很好的同步更新。
    我这里基于第四种灵活的模式来实现,DB和Code分开编写。分三步走。

第一步:引入EF
VS中NuGet需要添加两个引用包,当然你也可以用NuGet的包管理——程序包管理器控制台安装
Microsoft.EntityFrameworkCore 和 Pomelo.EntityFrameworkCore.MySql
当然在.NetCore中配置文件已Json的方式配置,你还得引入读取配置相关的包
Microsoft.Extensions.Configuration.Json

第二步:创建数据上下文DbContext
首先,什么是EF Core的数据上下文,建议参考下文章:https://www.cnblogs.com/Alex80/p/13413791.html。说得非常明白。
然后,我们来创建一个数据上下文MyDbContext类,继承自Microsoft.EntityFrameworkCore.DbContext。我们需要配置上数据库连接:在构造函数中指定需要读取的配置文件,并且重写OnConfiguring方法,在其中读取配置文件中我们配置的连接字符串,我这里读取的是appsettings.json配置文件中的名为Default的配置。
配置文件的Mysql连接字符串类似如下:

appsettings.json中的Mysql连接字符串
{
  "ConnectionStrings": {
    "Default": "Server=localhost;Database=ct_threeview;charset=utf8;uid=root;pwd=0b85232f9ebda56fc8a1f54f74383aF8a4055e570bb36cbb5;port=3506;"
  }
}

MyDbContext类中的主要代码如下,其中Test1,Study,Series就是我们的实体类,是和数据库中的表一一对应的。

实体类是我们自己项目中手动添加的类,Study表实体类参考如下,
可以通过特性Table特性标识实体对应的是数据库中的哪个表
可以通过Key特性来标识哪个字段是主键
可以通过Column特性来标识对应数据库表中的字段是哪个

到这里,真个的EF Core的引入就算完了,后面我们就可以开始使用了,这里我贴几个常规操作的代码,更多的大家可以参考微软官网或自行百度。

添加操作
        /// <summary>
        /// 这里是添加操作
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public Study Insert(Study entity)
        {
            using (MyDbContext db = new MyDbContext())
            {
                db.Study.Add(entity);
                db.SaveChanges();
                //entity.Id= db.Entry(entity).Entity.Id;//返回插入的记录并注入到userEntity,关键是这句
                return entity;
            }
        }
多表联查操作
        public List<PatientDataListModel> QueryAllData()
        {
            using (MyDbContext db = new MyDbContext())
            {
                var query = from a in db.Study
                            join b in db.Series on a.Id equals b.Study_Id
                            select new PatientDataListModel
                            {
                                StudyId = a.Id,
                                StudyInstanceUID = a.StudyInstanceUID,
                                StudyDate = a.StudyDate,
                                Modality = a.Modality,
                                StudyFilePath = a.StudyFilePath,
                                Notes=a.Notes,
                                PatientName = a.PatientName,
                                PatientID = a.PatientID,
                                PatientSex = a.PatientSex,
                                Frames = b.Frames,
                                SeriesId = b.Id,
              
使用事务的操作
            List<Sop> List = new List<Sop>(); ; 
            using (MyDbContext db = new MyDbContext())
            {
                //查询数据
                IQueryable<Sop>  query = db.Sop.FromSqlRaw($"select * from sop where Series_Id in (select Id from series where Study_Id = {studyId})");
                List = query.ToList();
                using (var transaction =db.Database.BeginTransaction())
                {
                    int effectRow = 0;
                    try
                    {

                        effectRow =db.Database.ExecuteSqlRaw(@"delete from sop where Series_Id in (
                                select Id from series where Study_Id = " + studyId + @")");
                        //transaction.CreateSavepoint("BeforeDelete"); //可以创建回滚点;出错后可以指定DB操作回滚到此前
                        db.Database.ExecuteSqlRaw(@"delete from series where Id=" + studyId);
                        //transaction.CreateSavepoint("BeforeDelete2"); //可以打开此代码,这里是创建的还原点2
          

当然,针对MyDbContext,我们也可以使用在Startup.cs注册,使用IOC的方式去使用。这种资料网上也非常多。

标签:Core,MyDbContext,数据库,EF,db,Mysql,Study,Id
From: https://www.cnblogs.com/huangqian/p/17985122

相关文章

  • Mysql配置文件
    部分段落  [mysqld]#配置字符集 排序规则character-set-server=utf8mb4collation-server=utf8mb4_0900_ai_ci #导出文本路径 导出大文件使用 require_secure_transport=ONsecure_file_priv=/var/lib/mysql-files/  #slow_sql 慢SQL查询开启 slow_query......
  • mysqldump备份
     mysql备份:backup_dir='/data/backup/mysql'database_name='dbname'bak_save_days=7dd=`date+%Y-%m-%d-%H-%M-%S`if[!-d$backup_dir];thenmkdir-p$backup_dirfimysqldump--defaults-extra-file=/etc/mypass.txt--flush-logs--sin......
  • EF Core 在实际开发中,如何分层?
    前言:什么是分层?分层就是将EFCore放在单独的项目中,其它项目如Asp.netcorewebapi项目引用它这样的好处是解耦和项目职责的清晰划分,并且可以重用EFCore项目但是也会数据库迁移变得复杂起来Stepbystep步骤创建一个.NET类库项目,项目名字为BooksEFCore引用......
  • git pull : 提示 can't lock ref 'xxxx' ,some local refs could not be update
    在执行gitpull操作时可能会遇到can'tlockref'xxxx',somelocalrefscouldnotbeupdate;tryrunninggitremotepruneorigintoremoveanyold,conflictingbranches。出现以上的问题的原因是本地所追踪的远程分支,与本地对应分支不同,导致的gitpull失败。如有一......
  • js/ts中Date类的ref响应式 -- VUE3
    现象:Date对象无法响应式原因:Date是个深层对象,外面那层可以响应,但是更改里面的层,则不会被侦测到改动解决:强制触发副作用即可参考文档:https://cn.vuejs.org/api/reactivity-advanced.html#triggerref<template><divclass="cnblogs_yucloud">{{DateTime}}</div>......
  • Adobe After Effects 2024:让你的创意动起来 mac/win版
    AdobeAfterEffects2024是一款专业的数字视觉效果、合成和运动图形软件,被广泛应用于电影、电视、广告和网络媒体等领域。它能够帮助用户快速高效地将创意转化为令人惊叹的视觉效果,是视觉艺术家的首选工具之一。→→↓↓载AdobeAfterEffects2024mac/win版在AdobeAfterE......
  • NetCore获取文件内容
    1、注入IWebHostEnvironmentprivateIWebHostEnvironment_hostEnvironment;publicFormBaseController(IWebHostEnvironmenthostEnvironment){_hostEnvironment=hostEnvironment;} 2、读取根目录下文件内容(Templates/Index.html)publicasyncTask<IActionRes......
  • EFCore 经验
    注意:EFCore在执行Remove-Migration取消最后一次迁移生成的文件时,先不要更改Config配置文件,否则可能无法执行取消操作当主表和明细表是主从关系时,默认生成时为级联删除,不需要在配置文件中声明publicclassProductionPlanDetailConfig:IEntityTypeConfiguration<Production......
  • 数据库学习笔记(五)—— MySQL 之 瓶颈及优化篇
    MySQL之瓶颈及优化篇数据库瓶颈阶段一:企业刚发展的阶段,最简单,一个应用服务器配一个关系型数据库,每次读写数据库。阶段二:无论是使用MySQL还是Oracle还是别的关系型数据库,数据库通常不会先成为性能瓶颈,通常随着企业规模的扩大,一台应用服务器扛不住上游过来的流量且一台......
  • 死磕Spring之IoC篇 - BeanDefinition 的解析过程(面向注解)
    BeanDefinition的解析过程(面向注解)前面的几篇文章对Spring解析XML文件生成BeanDefinition并注册的过程进行了较为详细的分析,这种定义Bean的方式是面向资源(XML)的方式。面向注解定义Bean的方式Spring的处理过程又是如何进行的?本文将会分析Spring是如何将 @Component......