天天看點

Entity Framework 5.0系列之自動生成Code First代碼Entity Framework Power Tools自定義模闆

在前面的文章中我們提到entity framework的“code first”模式也同樣可以基于現有資料庫進行開發。今天就讓我們一起看一下使用entity framework power tools如何基于現有資料庫生成資料類和資料庫上下等。

Entity Framework 5.0系列之自動生成Code First代碼Entity Framework Power Tools自定義模闆

安裝完之後隻要在項目上右鍵選擇entity framework->reverse engineer code first(項目中首先需要安裝entity framework 包,否則會有錯誤),然後在彈出的視窗中輸入相關的資料庫連接配接資訊即可(我們這裡使用“adventureworks”資料庫)。

Entity Framework 5.0系列之自動生成Code First代碼Entity Framework Power Tools自定義模闆
Entity Framework 5.0系列之自動生成Code First代碼Entity Framework Power Tools自定義模闆

注意:如果使用“adventureworks”資料庫,可能發生如下錯誤:

one or more errors occurred while loading schema information.

error 6004: the table 'adventureworks.production.document' is referenced by a relationship, but cannot be found.

然後我們稍等片刻,可以看到entity framework power tools已經根據所選資料庫自動為你生成了資料類、資料庫上下文操作類、對應的映射配置類并添加了資料庫連接配接配置。

Entity Framework 5.0系列之自動生成Code First代碼Entity Framework Power Tools自定義模闆

我們先看一下配置檔案,可以看到在配置檔案中entity framework power tools已經自動對資料庫連接配接串進行了配置,添加了名為“adventureworkscontext”的資料庫連接配接串:

與此同時,對生成的資料庫上下文操作類“adventureworkscontext”進行了配置,在構造函數中使用了上面配置的“adventureworkscontext”資料庫連接配接:

在項目中我們還可以看到entity framework power tools自動建立了一個models檔案夾,這裡除了“adventureworkscontext”類還有所有的資料類。在models檔案夾下還有一個“mapping”檔案夾,這裡放了資料類與資料庫的映射配置類,可以看出entity framework power tools通過fluent api的方式進行映射細節配置(目前entity framework power tools還不支援data annotations方式),關于配置類的具體細節我們這裡暫不進行詳細介紹。

下面我們進行資料查詢:

查詢結果:

Entity Framework 5.0系列之自動生成Code First代碼Entity Framework Power Tools自定義模闆

事實上entity framework power tools的功能還遠不止這些,例如我們上面談到entity framework power tools使用fluent api進行映射配置,而通常情況下開發人員更喜歡使用data annotations方式進行映射約定,那麼此時你就可以選擇配置自己的模闆。

首先讓我們打開mapping.tt檔案,這個檔案主要使用者生成配置類,在entity framework power tools預設生成的代碼中通過fluent api進行表名和資料類名以及屬性名同列名的對應配置,例如下面的代碼:

Entity Framework 5.0系列之自動生成Code First代碼Entity Framework Power Tools自定義模闆

下面讓我們修改一下mapping.tt檔案,去掉上面的限制,而改用data annotations方式進行約定。首先去掉下圖中選擇的代碼,此時生成的映射類中就不再出現上圖中選擇的代碼部分:

Entity Framework 5.0系列之自動生成Code First代碼Entity Framework Power Tools自定義模闆

然後我們需要修改entity.tt模闆,将資料庫中的表和列的映射聲明到資料類上。先讓我們将資料類和表做對應,這需要在資料類上添加“table”聲明,标記出表名和架構名(ef預設會使用dbo架構),在如圖位置添加如下代碼:

Entity Framework 5.0系列之自動生成Code First代碼Entity Framework Power Tools自定義模闆

這段代碼主要處理邏輯是:當架構不是“dbo”或者表名的複數形式同表名不同時添加“table”标記聲明。之是以添加判斷是因為ef的預設使用“dbo”架構并且ef在操作表的時候預設将資料類的複數形式作為表名。

接下來添加列标記聲明,在如圖位置添加如下代碼即可:

Entity Framework 5.0系列之自動生成Code First代碼Entity Framework Power Tools自定義模闆

這裡隻是簡單的對列名和編碼後的列名進行比較,不同則添加列标記,否則不添加(ef預設認為資料類屬性名和表的列名相同)。

由于剛才添加的标記屬性類在“system.componentmodel.dataannotations.schema” 命名空間下,是以最後還需要在模闆頭部添加該命名空間:

Entity Framework 5.0系列之自動生成Code First代碼Entity Framework Power Tools自定義模闆

由于之前的ef版本中“table”和“column”類不在“system.componentmodel.dataannotations.schema”命名空間而是在 “system.componentmodel.dataannotations”命名空間中,是以這裡我們還需要添加一個判斷。

今天的内容先到此為止,關于如何使用fluent api及data annotations定義配置類來進行更多的映射控制請關注後面的文章。