之前的文章中介紹了如何在ASP.NET中通過ADO.NET操作SQL Server和My SQL數據庫,數據庫的操作是通過SQL語句的執行來完成的,在ASP.NET中還有一個簡便的方式來使用數據庫,那就是通過Entity Framework這個ORM組件。EF操作數據的原理也是最終生成SQL來執行。
本文將從以下幾個方面來完成Entity Framework的介紹:
●什么是ORM
●Entity Framework
●使用EF Code First操作數據庫
什么是ORM
對象關系映射(Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用於實現面向對象編程語言里不同類型系統的數據之間的轉換。(百度百科)。
Object-relational mapping (ORM, O/RM, and O/R mapping tool) in computer science is a programming technique for converting data between incompatible type systems using object-oriented programming languages.(wikipedia)
以上兩個解釋的核心點都在於“面向對象”、“不同類型系統”、“數據轉換”,對於使用ASP.NET MVC開發的應用程序來說,開發語言C#就是一個面向對象編程語言,定義的實體類Post就是一個失血模型(只有屬性沒有方法)對象。而數據庫系統與博客系統是兩個不同的系統,對於數據庫系統來說它將數據看成由數字或字符串構成的一張張表格,而面向對象語言所開發的程序將數據看作一個個實例,表格數據和實例數據是不兼容的,所以需要轉換,如之前的代碼:
在之前的代碼中,通過自己編寫代碼的方式完成了轉換,既然ORM是一種程序技術,那么在ASP.NET中是如何體現的呢?
Entity Framework
Entity Framework(EF)是一個對象關系映射器,它讓.Net開發人員可以使用領域對象來操作關系數據,並幫助開發人員省略大部分訪問數據的代碼。
如何使用Entity Framework?
在介紹如何使用EF之前,先了解一下EF的幾種工作流,它們如下圖所示:
● 模型優先(創建一個新的數據庫):
○ 在設計器中創建模型。
○ 通過模型創建數據庫。
○ 通過模型自動生成實體類。
● 數據庫優先(使用已存在的數據庫):
○ 在設計器中反向工程模型。
○ 通過模型自動生成實體類。
● 代碼優先(新數據庫):
○ 在代碼中定義實體類和映射(如類和表的映射、屬性和表列的映射)。
○ 通過模型創建數據庫。
○ 使用Migrations去更新數據庫(結構)。
● 代碼優先(使用已存在數據庫):
○ 在代碼中定義實體類和映射(如類和表的映射、屬性和表列的映射)。
○ 或者使用反向工程生成實體類和映射。
使用EF Code First操作數據庫
對於本系列文章僅對代碼優先(Code First)做介紹(*^_^*)/
現在Blog代碼中已經存在實體類並且已經存在數據庫和對應的數據表,所以不需要再創建。
1. 通過Nuget獲取Entity Framework庫:
因為BlogRepository是管理數據存儲的庫,所以應該將EntityFramework安裝到該項目上:
2. 創建DBContext類型:
DBContext是EF中的核心類型,EF中的從數據庫獲取數據填充到實體對象、變化跟蹤以及將數據持久化到數據庫都是有DBContext完成的。而創建一個DBContext最常用的方法就是繼承DbContext類型來實現,DbContext類型位於EntityFramework程序集下的System.Data.Entity命名空間下:
3. 在實體中添加DbSet屬性:
DbSet屬性代表指定類型的一個數據集合,所有對數據的添加、刪除、修改、查詢都是通過這個屬性實現的。
4. 通過構造方法給DbContext指定數據庫連接字符串:
5. 將BlogRepository替換成BlogContext操作數據庫:
注:別忘記添加Linq命名空間來使用對數據集合的操作。
6. 運行程序(查看博客列表頁面):
出錯了,錯誤信息顯示找不到名稱為“System.Data.SqlClient”的ADO.NET提供器,為什么?
在使用Nuget安裝EF的時候會自動在Web.config或者App.config中創建一下配置信息:
在本例中EF安裝到了BlogRepository類庫項目上,所以程序在啟動時是無法讀取到這些配置信息的,但要注意的是錯誤信息的重點在於“找不到ADO.NET Provider”而不是找不到配置信息。所以實際上這個問題的根本原因在於安裝EF組件后,默認會添加EntityFramework.dll以及EntityFramework.SqlServer.dll兩個庫文件的引用,但是由於EF沒有安裝到啟動項目上,所以在項目編譯時只會復制主項目依賴的程序集,以及被依賴程序集使用到的程序集。就是說BlogRepository只用到了EntityFramework.dll而沒有使用到EntityFramework.SqlServer.dll所以后者沒有在主項目的bin目錄下,所以僅需要將該程序集復制到MVC項目的bin目錄下即可運行:
注:EF是基於“約定優先於配置”原則,所以EF的默認約定就是使用SQL SERVER,所以在這里如果沒有特殊的需求,沒有配置信息EF也是能夠正常運行的,更多關於EF配置的介紹會在后續章節中完成。
小結
本章主要介紹了ASP.NET中的ORM框架Entity Framework,並且演示了如何安裝EF、創建DbContext和DbSet並使用它們訪問數據庫。使用EF后相比起之前獲取數據庫數據代碼已經少了很多,一句代碼就可以完成數據的獲取功能,大大的提高了開發效率。
在本文中有一個要注意的問題就是EF是間接被主項目使用的,所以一些與EF有關的功能如更新數據庫(update-database)以及數據庫遷移(migration)命令的使用都會與EF在被主項目直接使用有所區別,關於EF的更多內容將在后續文章中介紹。
參考:
https://msdn.microsoft.com/en-us/library/aa937723(v=vs.113).aspx
https://msdn.microsoft.com/en-us/library/ee712907(v=vs.113).aspx
歡迎添加個人微信號:Like若所思。
歡迎關注我的公眾號,不僅為你推薦最新的博文,還有更多驚喜和資源在等着你!一起學習共同進步!