Entity Framework Core的前身是微軟提供并主推的ORM框架,簡(jiǎn)稱EF,其底層是對(duì)ADO.NET的封裝。EF支持SQLServer、MYSQL、Oracle、Sqlite等所有主流數(shù)據(jù)庫(kù)。
首先是使用時(shí)的幾個(gè)模式的整理及其理解:
- Code First:根據(jù)代碼自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu)甚至是數(shù)據(jù)庫(kù),可以支持多庫(kù)開(kāi)發(fā),代碼較少冗余,由于會(huì)自動(dòng)更改數(shù)據(jù)庫(kù),如果有在實(shí)體類(lèi)中自定義了字段,不希望在數(shù)據(jù)庫(kù)中創(chuàng)建此字段(有時(shí)偷懶,不想定義ViewModel會(huì)這樣做),還需要自己實(shí)現(xiàn)單獨(dú)的生成代碼。這就復(fù)雜了。
- DB First:根據(jù)現(xiàn)有的數(shù)據(jù)庫(kù)結(jié)構(gòu)生成模型類(lèi)或?qū)嶓w類(lèi),這種適合數(shù)據(jù)庫(kù)結(jié)構(gòu)比較穩(wěn)定的產(chǎn)品,數(shù)據(jù)庫(kù)結(jié)構(gòu)較大,表較多,甚至多人開(kāi)發(fā)時(shí)頻繁變動(dòng)各自都要去生成太容易出錯(cuò)。同樣偷懶模式下會(huì)刪除字段。
- Model First:這種有可視化的模型設(shè)計(jì),也就是Edm文件,可以利用VS等工具快速生成數(shù)據(jù)庫(kù)腳本,類(lèi)似Code Fist,只不過(guò)能可視化編寫(xiě)模式,需要完全了解數(shù)據(jù)庫(kù)結(jié)構(gòu),貌似現(xiàn)在的NET Core時(shí)代沒(méi)有這玩意了。
- 靈活的模式:這個(gè)算是我自加的,我稱之為靈活的模式,就是DB和Code分開(kāi)來(lái)實(shí)現(xiàn),可以由不同的人來(lái)協(xié)作完成,更適合團(tuán)隊(duì)協(xié)作,DB由A來(lái)完成,Code由B來(lái)完成,甚至更多的人來(lái)參與,當(dāng)然這個(gè)也會(huì)有一個(gè)大問(wèn)題就是可能實(shí)體Code和DB不能很好的同步更新。
我這里基于第四種靈活的模式來(lái)實(shí)現(xiàn),DB和Code分開(kāi)編寫(xiě)。分三步走。
第一步:引入EF
VS中NuGet需要添加兩個(gè)引用包,當(dāng)然你也可以用NuGet的包管理——程序包管理器控制臺(tái)安裝Microsoft.EntityFrameworkCore 和 Pomelo.EntityFrameworkCore.MySql
當(dāng)然在.NetCore中配置文件已Json的方式配置,你還得引入讀取配置相關(guān)的包Microsoft.Extensions.Configuration.Json
第二步:創(chuàng)建數(shù)據(jù)上下文DbContext
首先,什么是EF Core的數(shù)據(jù)上下文,建議參考下文章:https://www.cnblogs.com/Alex80/p/13413791.html。說(shuō)得非常明白。
然后,我們來(lái)創(chuàng)建一個(gè)數(shù)據(jù)上下文MyDbContext類(lèi),繼承自Microsoft.EntityFrameworkCore.DbContext。我們需要配置上數(shù)據(jù)庫(kù)連接:在構(gòu)造函數(shù)中指定需要讀取的配置文件,并且重寫(xiě)OnConfiguring方法,在其中讀取配置文件中我們配置的連接字符串,我這里讀取的是appsettings.json配置文件中的名為Default的配置。
配置文件的Mysql連接字符串類(lèi)似如下:
appsettings.json中的Mysql連接字符串
{
"ConnectionStrings": {
"Default": "Server=localhost;Database=ct_threeview;charset=utf8;uid=root;pwd=0b85232f9ebda56fc8a1f54f74383aF8a4055e570bb36cbb5;port=3506;"
}
}
MyDbContext類(lèi)中的主要代碼如下,其中Test1,Study,Series就是我們的實(shí)體類(lèi),是和數(shù)據(jù)庫(kù)中的表一一對(duì)應(yīng)的。
實(shí)體類(lèi)是我們自己項(xiàng)目中手動(dòng)添加的類(lèi),Study表實(shí)體類(lèi)參考如下,
可以通過(guò)特性Table特性標(biāo)識(shí)實(shí)體對(duì)應(yīng)的是數(shù)據(jù)庫(kù)中的哪個(gè)表
可以通過(guò)Key特性來(lái)標(biāo)識(shí)哪個(gè)字段是主鍵
可以通過(guò)Column特性來(lái)標(biāo)識(shí)對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的字段是哪個(gè)
到這里,真?zhèn)€的EF Core的引入就算完了,后面我們就可以開(kāi)始使用了,這里我貼幾個(gè)常規(guī)操作的代碼,更多的大家可以參考微軟官網(wǎng)或自行百度。
添加操作
/// <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,關(guān)鍵是這句
return entity;
}
}
單個(gè)表部分字段更新操作
public void UpdateNote(int studyId,string Note)
{
using (MyDbContext db = new MyDbContext())
{
var study = new Study() { Id = studyId, Notes = Note,modify_time=DateTime.Now };
db.Study.Attach(study);
db.Entry<Study>(study).Property("Notes").IsModified = true;
db.Entry<Study>(study).Property("modify_time").IsModified = true;
db.SaveChanges();
}
}
多表聯(lián)查操作
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,
使用事務(wù)的操作
List<Sop> List = new List<Sop>(); ;
using (MyDbContext db = new MyDbContext())
{
//查詢數(shù)據(jù)
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"); //可以創(chuàng)建回滾點(diǎn);出錯(cuò)后可以指定DB操作回滾到此前
db.Database.ExecuteSqlRaw(@"delete from series where Id=" + studyId);
//transaction.CreateSavepoint("BeforeDelete2"); //可以打開(kāi)此代碼,這里是創(chuàng)建的還原點(diǎn)2
當(dāng)然,針對(duì)MyDbContext,我們也可以使用在Startup.cs注冊(cè),使用IOC的方式去使用。這種資料網(wǎng)上也非常多。
最后,在項(xiàng)目調(diào)試時(shí),如果想實(shí)時(shí)查看EF 生成的SQL語(yǔ)句確實(shí)不方便,不像SqlSugar那樣有一個(gè)tosql方法能直接看到。我目前沒(méi)有找到很好的方法,參考網(wǎng)上其他人給出方案,就是在VS的控制臺(tái)來(lái)輸出SQL語(yǔ)句,當(dāng)然,我們首先需要引入微軟的官方日志組件Microsoft.Extensions.Logging.Debug。
然后再數(shù)據(jù)上下文(這里是MyDBContext)類(lèi)中New一個(gè)日志工廠,在OnConfiguring方法中添加日志組件,這樣我們?cè)谡{(diào)試時(shí)就能在VS的調(diào)試輸出中看到生成的SQL語(yǔ)句。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-821498.html
EFCore逆向工程——生成實(shí)體類(lèi)
如果想逆向根據(jù)DB的表結(jié)構(gòu)來(lái)生成實(shí)體類(lèi),這里需要借助與微軟提供的包:Microsoft.EntityFrameworkCore.Tools
首先在NuGet中引入Microsoft.EntityFrameworkCore.Tools,然后VS中菜單選擇工具——》NuGet包管理器——》程序包管理器控制臺(tái)。在包管理器控制臺(tái)輸入如下命令:Scaffold-DbContext 'Server=localhost;Database=您的數(shù)據(jù)庫(kù)名;charset=utf8;uid=賬號(hào);pwd=密碼;port=端口;' Pomelo.EntityFrameworkCore.MySql -OutputDir "輸出的目錄文件夾"
OutputDir 如果不提供的話會(huì)將實(shí)體類(lèi)生成在項(xiàng)目根目錄下,看個(gè)人需求。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-821498.html
到了這里,關(guān)于Net Core中使用EF Core連接Mysql數(shù)據(jù)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!