用Way.EntityDB进行Entity Framework Core数据库建模
Way.EntityDB是一個(gè)基于EF Core的數(shù)據(jù)層框架,它取消了EF Core的Migration機(jī)制,因?yàn)镸igration并不是通用的,比如說(shuō)sql server生成的migration,如果換成sqlite,運(yùn)行時(shí)會(huì)報(bào)錯(cuò)的,也就是數(shù)據(jù)庫(kù)不能更換。
Way.EntityDB內(nèi)置建模工具,通過(guò)圖形化建表,生成Model對(duì)象代碼,并且它會(huì)把表結(jié)構(gòu)的修改過(guò)程,全部記錄下來(lái),涵蓋在Model代碼里面,所以,在新的代碼運(yùn)行時(shí),數(shù)據(jù)庫(kù)也會(huì)自動(dòng)更新到最新結(jié)構(gòu)。
?舉個(gè)例子,當(dāng)你把一個(gè)字段的名字從column1,更改為column2,EF Core生成的migration,就是把column1刪除,并添加一個(gè)column2,這樣,column1的現(xiàn)有數(shù)據(jù)就會(huì)丟失。而EntityDB則不一樣,它只會(huì)把column1改名為column2,
因?yàn)樗涗浀氖潜斫Y(jié)構(gòu)修改的過(guò)程,而不是匹對(duì)Model類的前后變化。
?
Way.EntityDB源碼位置:
https://github.com/simpleway2016/EntityDB
啟動(dòng)服務(wù)器端
Way.EntityDB是允許多人同時(shí)使用,所以,分為服務(wù)器和客戶端。
下載源碼,編譯后,在Debug/netcoreapp2.0文件夾里面,創(chuàng)建一個(gè)批處理文件run6062.bat,內(nèi)容如下:
dotnet Way.EJServer.dll 6062
6062是本機(jī)任意一個(gè)沒有使用的端口號(hào),表示以6062為端口,創(chuàng)建一個(gè)服務(wù)器工作空間
運(yùn)行run6062.bat,啟動(dòng)服務(wù)器端
?
運(yùn)行客戶端
編譯并運(yùn)行EJClient.exe
server url:https://localhost:6062
user name:sa
password:1
登錄進(jìn)去,由于沒有工程項(xiàng)目,所以界面空白,點(diǎn)擊【project】菜單,創(chuàng)建一個(gè)項(xiàng)目
右鍵點(diǎn)擊【Database】,新建一個(gè)數(shù)據(jù)庫(kù)
再新建一個(gè)數(shù)據(jù)模塊UserInfo
雙擊UserInfo,在數(shù)據(jù)模塊里面,空白處點(diǎn)擊右鍵,新建數(shù)據(jù)表
?
?
?
這樣,一張數(shù)據(jù)表就創(chuàng)建完成
你必須掌握的Entity Framework 6.x與Core 2.0
作者:汪鵬
當(dāng)當(dāng) 廣告 購(gòu)買編程使用數(shù)據(jù)表
新建一個(gè).net core 控制臺(tái)項(xiàng)目
給這個(gè)項(xiàng)目安裝nuget包:Way.EntityDB
然后,回到EJClient,在TestDB處點(diǎn)擊右鍵,點(diǎn)擊【生成數(shù)據(jù)庫(kù)模型代碼】
保存到剛才創(chuàng)建的項(xiàng)目里面
?
?這樣,Model類就準(zhǔn)備好了,開始寫代碼
從代碼可以看到,雖然也是EF Core,但由于禁用了ef的數(shù)據(jù)緩存機(jī)制,所以不能使用SaveChanges去同步數(shù)據(jù)庫(kù),可以使用Insert Update Delete等方法同步數(shù)據(jù)庫(kù)
禁用緩存機(jī)制,可以避免程序員在編程的時(shí)候混亂(有時(shí)候想把數(shù)據(jù)取出來(lái),看看現(xiàn)在的數(shù)據(jù)狀態(tài),但誰(shuí)知道取的是緩存里面的對(duì)象)
禁用緩存機(jī)制,對(duì)于大數(shù)據(jù)量的查詢,也可以節(jié)約內(nèi)存,提供效率,因?yàn)椴辉偈褂玫膶?duì)象,不會(huì)保存在內(nèi)存里面
所以整體性能,應(yīng)該和使用ADO.Net差不多
編寫觸發(fā)器?
?Way.EntityDB支持類似觸發(fā)器的功能。添加一個(gè)ActionCapture類
class UserInfoTrigger : Way.EntityDB.ActionCapture<MyDB.UserInfo> ?表示這個(gè)類捕獲的是UserInfo表的事件這時(shí)候,這個(gè)類還不能起作用,必須在程序啟動(dòng)時(shí),把它實(shí)例化,注冊(cè)到DBContext里面 static Program(){Way.EntityDB.DBContext.RegisterActionCapture(new UserInfoTrigger());}
在ActionCapture類里面,只要override各個(gè)方法,就可以實(shí)現(xiàn)各種事件的捕獲。
級(jí)聯(lián)刪除
?EJClient可以設(shè)置表之間的級(jí)聯(lián)刪除關(guān)系,并且,被級(jí)聯(lián)刪除的數(shù)據(jù),同樣可以被你編寫的觸發(fā)器捕捉到。
現(xiàn)在,我們新建一張數(shù)據(jù)表FamilyInfo
雙擊UserInfo,打開屬性框,切換到【級(jí)聯(lián)刪除】項(xiàng),添加一個(gè)級(jí)聯(lián)刪除關(guān)系
導(dǎo)航屬性(一對(duì)一)
雖然UserInfo和FamilyInfo,在數(shù)據(jù)庫(kù)中并沒有建立關(guān)系,但是,從系統(tǒng)設(shè)計(jì)上來(lái)說(shuō),他們是有關(guān)系的,所以,在UserInfo里面,如果可以直接訪問(wèn)FamilyInfo,會(huì)比較方便,所以,
可以給他們添加導(dǎo)航屬性,首先,我們假設(shè)他們是一對(duì)一的關(guān)系。
打開UserInfo屬性窗口,切換到【導(dǎo)航屬性】,并添加一個(gè)名稱為Family的屬性
然后,打開FamilyInfo屬性窗口,添加一個(gè)User屬性
這里要注意,UserInfo里面的Family屬性,不需要選擇ForeignKey,而FamilyInfo的User屬性,必須選擇ForeignKey
接著用EJClient生成Model代碼
然后,代碼,我們可以這樣寫了
var montherName = jack.Family.MotherName;直接可以取到母親姓名,不需要到數(shù)據(jù)庫(kù)再取一遍?導(dǎo)航屬性(一對(duì)多)
?如果UserInfo和FamilyInfo是一對(duì)多的關(guān)系,那么,打開userinfo對(duì)話框,把導(dǎo)航屬性改為這樣:
這時(shí)候,就必須選擇ForeignKey了
用工具再次生成Model代碼
這次的代碼,就是這樣寫了:
變更數(shù)據(jù)庫(kù)類型
如果在開發(fā)過(guò)程中,你要變更數(shù)據(jù)庫(kù)類型,只需要更改連接字符串和類型即可
var db = new MyDB.DB.TestDB("server=192.168.136.137;uid=sa;pwd=Sql12345678;Database=TestDB", Way.EntityDB.DatabaseType.SqlServer);這樣,就轉(zhuǎn)而使用SqlServer數(shù)據(jù)庫(kù)
原文地址:https://www.cnblogs.com/IWings/p/9304874.html
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的用Way.EntityDB进行Entity Framework Core数据库建模的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 给正在努力的您几条建议(附开源代码)
- 下一篇: .net core redis 驱动推荐