翼度科技»论坛 编程开发 .net 查看内容

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

7

主题

7

帖子

21

积分

新手上路

Rank: 1

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

  • Code First:根据代码自动创建数据库表结构甚至是数据库,可以支持多库开发,代码较少冗余,由于会自动更改数据库,如果有在实体类中自定义了字段,不希望在数据库中创建此字段(有时偷懒,不想定义ViewModel会这样做),还需要自己实现单独的生成代码。这就复杂了。
  • DB First:根据现有的数据库结构生成模型类或实体类,这种适合数据库结构比较稳定的产品,数据库结构较大,表较多,甚至多人开发时频繁变动各自都要去生成太容易出错。同样偷懒模式下会删除字段。
  • Model First:这种有可视化的模型设计,也就是Edm文件,可以利用VS等工具快速生成数据库脚本,类似Code Fist,只不过能可视化编写模式,需要完全了解数据库结构,貌似现在的NET Core时代没有这玩意了。
  • 灵活的模式:这个算是我自加的,我称之为灵活的模式,就是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连接字符串
  1. {
  2.   "ConnectionStrings": {
  3.     "Default": "Server=localhost;Database=ct_threeview;charset=utf8;uid=root;pwd=0b85232f9ebda56fc8a1f54f74383aF8a4055e570bb36cbb5;port=3506;"
  4.   }
  5. }
复制代码
MyDbContext类中的主要代码如下,其中Test1,Study,Series就是我们的实体类,是和数据库中的表一一对应的。

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

到这里,真个的EF Core的引入就算完了,后面我们就可以开始使用了,这里我贴几个常规操作的代码,更多的大家可以参考微软官网或自行百度。
添加操作
  1.         /// <summary>
  2.         /// 这里是添加操作
  3.         /// </summary>
  4.         /// <param name="entity"></param>
  5.         /// <returns></returns>
  6.         public Study Insert(Study entity)
  7.         {
  8.             using (MyDbContext db = new MyDbContext())
  9.             {
  10.                 db.Study.Add(entity);
  11.                 db.SaveChanges();
  12.                 //entity.Id= db.Entry(entity).Entity.Id;//返回插入的记录并注入到userEntity,关键是这句
  13.                 return entity;
  14.             }
  15.         }
复制代码
多表联查操作
  1.         public List<PatientDataListModel> QueryAllData()
  2.         {
  3.             using (MyDbContext db = new MyDbContext())
  4.             {
  5.                 var query = from a in db.Study
  6.                             join b in db.Series on a.Id equals b.Study_Id
  7.                             select new PatientDataListModel
  8.                             {
  9.                                 StudyId = a.Id,
  10.                                 StudyInstanceUID = a.StudyInstanceUID,
  11.                                 StudyDate = a.StudyDate,
  12.                                 Modality = a.Modality,
  13.                                 StudyFilePath = a.StudyFilePath,
  14.                                 Notes=a.Notes,
  15.                                 PatientName = a.PatientName,
  16.                                 PatientID = a.PatientID,
  17.                                 PatientSex = a.PatientSex,
  18.                                 Frames = b.Frames,
  19.                                 SeriesId = b.Id,
  20.               
复制代码
使用事务的操作
  1.             List<Sop> List = new List<Sop>(); ;
  2.             using (MyDbContext db = new MyDbContext())
  3.             {
  4.                 //查询数据
  5.                 IQueryable<Sop>  query = db.Sop.FromSqlRaw($"select * from sop where Series_Id in (select Id from series where Study_Id = {studyId})");
  6.                 List = query.ToList();
  7.                 using (var transaction =db.Database.BeginTransaction())
  8.                 {
  9.                     int effectRow = 0;
  10.                     try
  11.                     {
  12.                         effectRow =db.Database.ExecuteSqlRaw(@"delete from sop where Series_Id in (
  13.                                 select Id from series where Study_Id = " + studyId + @")");
  14.                         //transaction.CreateSavepoint("BeforeDelete"); //可以创建回滚点;出错后可以指定DB操作回滚到此前
  15.                         db.Database.ExecuteSqlRaw(@"delete from series where Id=" + studyId);
  16.                         //transaction.CreateSavepoint("BeforeDelete2"); //可以打开此代码,这里是创建的还原点2
  17.          
复制代码
当然,针对MyDbContext,我们也可以使用在Startup.cs注册,使用IOC的方式去使用。这种资料网上也非常多。

来源:https://www.cnblogs.com/huangqian/p/17985122
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具