在項目ITOO3.0中,有一個技術點是動態建庫建表。簡單的解釋一下,就用一個用來來注冊我們高校雲平台系統的時候,我們會動態的為他創建一整套ITOO的後台數據庫。好了,項目背景理清楚了,下面是具體的實現過程。
一、業務分析
以我們平時注冊今目標為例,我們在注冊今目標的過程中,具體步驟是這樣的:
圖1 今目標登陸流程
詳細解釋一下:
第一步:注冊界面。輸入手機號或者郵箱,點擊確定進入基本信息界面。
第二步:基本信息。完善用戶的基本信息,點擊注冊完成注冊。其中我們要說的建庫建表就是這這一步實現的
第三步:完成信息。用戶完成注冊後,彈出提示框,告知用戶自己被分配的企業號,賬號和密碼。
二、代碼設計
首先,我們使用.NET MVC + EF架構,先創建三個界面。
圖2 創建三個界面
其次,根據數據庫生成CodeFirst代碼。如果我們要自己寫CodeFirst代碼,會十分麻煩,而且類之間的聯系不容易把握。貼心的微軟為我們從數據庫生成CodeFirst代碼提供了一個很好的插件:Entity Framework Power Tools Bata 4,打開VS ==> 工具 ==> 擴展和更新,聯機搜索一下就可以了。
圖3 Entity Framework Power Tools Bata 4插件安裝
安裝好之後,新建一個類庫或者在原類庫上右擊,會有多了一個EntityFramework選項(沒有的重啟下VS),然後選擇Reverse Engineer Code First選項,會彈出我們熟悉的連接數據庫的彈出框,點擊確定會自動根據數據庫創建出CodeFirst代碼,非常方便。
圖4-1 生成CodeFirst代碼
圖4-2 連接數據庫屬性
圖4-3 從數據庫生成CodeFirst代碼
最後,就是在代碼中實現數據庫的自動創建了,就是我們在點擊注冊按鈕動態生成一整套數據庫的操作,這裡只給大家展示了動態建庫的關鍵代碼。
這一步要做兩件事情:
1.修改EF上下文的構造函數為數據庫連接字符床,因為默認是從配置文件讀取的。
namespace DbFristModel.Models { public partial class ModelTestContext : DbContext { static ModelTestContext() { Database.SetInitializer(null); } //修改上下文默認構造函數 public ModelTestContext(string connectionString) : base(connectionString) { //判斷上下文中是否存在連接字符串中的數據庫,存在則連接,不存在則自動創建 this.Database.CreateIfNotExists(); } public DbSet Classes { get; set; } public DbSet Students { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new ClassMap()); modelBuilder.Configurations.Add(new StudentMap()); } } }
2.在點擊注冊按鈕的時候動態建庫,Controller中的代碼:
//連接字符串 string connectionString = "Data Source=.; User=sa;Password=123456;Initial Catalog=" + db.DbName + ";Integrated Security=True"; ModelTestContext newDB = new ModelTestContext(connectionString);
至此,我們動態建庫的關鍵代碼都已經實現了,要給大家說明的一點是,數據庫的名字是權限系統的數據庫ID+學校代碼自動生成的,所以每次注冊我們都能夠生成不同的數據庫。
效果展示:
圖5 動態創建的數據庫