建立DbContext

tkbSimplest發表於2015-10-31

返回總目錄《一步一步使用ABP框架搭建正式專案系列教程》


上一篇介紹了《建立實體》,這一篇我們順其自然地介紹《建立DbContext》。

溫故:

提到DbContext,對於經常使用DbFirst模式的開發者來說已經再熟悉不過了,EntityFramework全靠這員大將。它的作用是代表與資料庫連線的會話,提供了查詢、狀態跟蹤、儲存等功能。

還有一個重要的物件是DbSet,對實體型別提供了集合操作,比如Add、Attach、Remove。繼承了DbQuery,所以可以提供查詢功能。

知新:

ABP框架為我們建立了一個DbContext模板。這個模板就是我專案中基礎設施層的ChargeStationDbContext.cs檔案(當然,如果你的專案名稱是XX,那麼它的名字就是XXDbContext.cs),如下圖:

image

開幹:

雙擊開啟這個檔案開始編輯。

image

 

開啟檔案之後,發現有個todo提示,這個提示告訴我們“為你的實體們定義IDbset”。好,接下來,我們就在這個地方來定義以下程式碼。

        public virtual IDbSet<Cities> Cities { set; get; }
        public virtual IDbSet<CoinsCollectionDataLogs> CoinsCollectionDataLogs { set; get; }
        public virtual IDbSet<DeviceCoinsRecords> DeviceCoinsRecords { set; get; }
        public virtual IDbSet<DeviceNoDataSets> DeviceNoDataSets { set; get; }
        public virtual IDbSet<MoneyBoxRecycleRecords> MoneyBoxRecycleRecord { set; get; }
        public virtual IDbSet<MonthEndReports> MonthEndReports { set; get; }
        public virtual IDbSet<Operators> Operators { set; get; }
        public virtual IDbSet<Orders> Orders { set; get; }
        public virtual IDbSet<Provinces> Provinces { set; get; }
        public virtual IDbSet<RefundOrders> RefundOrders { set; get; }
        public virtual IDbSet<Stations> Stations { set; get; }
        public virtual IDbSet<TerminalAlertLogs> TerminalAlertLogs { set; get; }
        public virtual IDbSet<TerminalDevices> TerminalDevices { set; get; }
        public virtual IDbSet<TerminalMaintainLogs> TerminalMaintainLogs { set; get; }
        public virtual IDbSet<TransDetails> TransDetails { set; get; }

再次注意一下這裡的提示“為你的實體們定義IDbset”,因為我的實體中還定義了Abp開頭的一些Users和Roles等等,所以我在這裡繼續定義它們的IDbSet。定義之後,發

現報錯,原話是這樣的:“The key word ‘new’is required on ‘Roles’because it hides property IDbSet<TRole> AbpZeroDbContext<TTenant, TRole, TU

ser>”,翻譯成人話就是說“父類中已經有這個屬性了,如果你還要定義的話,就必須加一個new關鍵字來隱藏父類的同名屬性”。可見,父類中已經定義了關於租戶,使用者和

角色等的屬性,那麼我們直接用就好了。來看看ABP module-Zero中的原始碼:

image

ABP已經幫我們做了這麼多,這就是它強大之所在啊。因而,推斷出這裡我們不用再定義這些東西的IDbSet了,只需定義自己業務的實體,相應地,之前(上一篇)建立的這些實體也應該刪除了。

 

好了,這裡我們定義完了IDbSet,那麼AbpZeroDbContext是怎麼連線到資料庫的呢?它的連線字串在哪呢?

注意看該類的建構函式,它呼叫了父類的建構函式,並且將“Default”字串傳給父類的建構函式。實際上,這個字串一直從AbpZeroDbContext類傳給其父類AbpContext,再向上傳給父類DbContex,用於資料庫的連線使用。最後通過讀取Web.Config中name屬性的值為“Default”的連線字串來連線資料庫。

<connectionStrings>
    <add name="Default" connectionString="Server=localhost; Database=ChargeStation; Trusted_Connection=True;" providerName="System.Data.SqlClient" />
  </connectionStrings>

好了,今天的《建立DbContext》就說到這裡,肚子餓了,該去做午飯了!下一篇我們聊《建立資料庫遷移》,讓我們一小步一小步地揭開ABP框架的神祕面紗,敬請關注!

相關文章