ORM(一):EF的簡介、簡單創建與運用

Entity Framework實體框架(EF)是ADO.NET的開源對象關係映射(ORM)框架,它是.NET Framework的一部分,是一組支持開發面向數據的軟件應用程序的技術。微軟爲實現.NET跨平臺,將EF從.NET分離,使EF更加組件化。2016年6月27日,Entity Framework 7做爲實體框架核心1.0發佈,與ASP.Net Core 1.0和.Net Core 1.0一塊兒發佈,重命名爲凸顯出它是徹底從新而不是增量升級,同時,EF7並不會取代EF6。html

在EF中的實體數據模型(EDM)由如下三種模型和具備相應文件擴展名的映射文件進行定義。
概念架構定義語言文件(.csdl)——定義概念模型
存儲架構定義語言文件(.ssdl)——定義存儲模型
映射規範語言文件(.msl)——定義存儲模型與概念模型之間的映射M。數據庫

實體框架 使用這些基於XML的模型和映射文件將對概念模型中的實體和關係的建立、讀取、更新、和刪除操做轉換爲數據源中的等效操做。EDM甚至支持將概念模型中的實體映射到數據源中的存儲過程。數據結構

 

ORM(Object Relational Mapping)框架採用元數據來描述對象一關係映射細節,元數據通常採用XML格式,而且存放在專門的對象一映射文件中。架構

廣義上來講,ORM能夠被認爲是 面向對象模型和關係型數據庫的數據結構之間的相互轉換。app

狹義上來講,ORM能夠被認爲是,基於關係型數據庫的數據存儲,實現了一個虛擬的面向對象的數據訪問接口。理想狀況下,基於這樣一個面對對象的接口,持續化一個OO對象應該不須要了解任何關係型數據庫存儲數據的實現細節。框架

 

其餘.NET ORM框架:組件化

    1. PetaPoco : 
      與完備的ORM框架不一樣,PetaPoco更加註重易用性和性能。使用PataPoco只須要引入一個C#文件,可使用強類型的POCO(Plain Old CLR Object),並支持 T4 模板生成的類等。此外,因爲PetaPoco是開源項目,所以添加條件來處理如空間數據等特定狀況會很容易。
    2. Dapper : 
      性能方面高於PetaPoco,速度只稍遜於手工編碼的數據訪問層(DAL、Data AccessLayer),還有一些對初學者會有幫助的、位於官網上的系列博文和一些獨立博文教程。

 

VS配置EF環境

1.使用EF,建立Model (DataFirst)

  1. 在解決方案中,建立所使用的項目。例如:ASP網站項目、WinForm窗體項目……
  2. 在新建的項目中,添加 > 新建項 > 數據 > ADO.NET實體數據模型(.edmx)
  3. 在新建的.edmx中選擇:從數據庫生成(DatabaseFirst)
  4. 選擇新建鏈接,填寫鏈接數據庫 > 填寫登陸數據庫信息 > 選擇或輸入須要生成模型的數據庫名稱.
  5. 選擇須要建立模型的表、視圖、存儲過程
  6. 點擊下一步,直接生成(有些電腦可能會出現警告信息,忽視便可)。

 

流程.png

2.使用EF建立的內容

0.建立完成後,項目會默認引入兩個命名空間:EntityFramework、System.Data.Entity性能

1. 最外層爲.edmx文件,EF模型設計器,展現從數據庫建立的模型,包括:表名、屬性(表字段)、導航屬性(外鍵、表與表之間的對應關係)、表與表之間1對一、1對多的關係。網站

2. Model1.Context.tt、Model.Designer.cs、Model.edmx.diagram、Model1.tt編碼

1). Model1.Context.tt:包含Model1.Context.cs

 Model1.Context.tt由T4模板生成,不可更改,Model1.Context.cs繼承自DbContext,包括構造方法(繼承自父類的構造方法,並在此傳遞配置文件的數據庫鏈接字符串)、各個表所對應的Dbset<T>類型的自動屬性。

2). Model.Designer.cs:自動生成,無需更改

3) . Model.edmx.diagram:描述edmx文件的元素信息(名稱、位置……)

4). Model1.tt:包含生成的Model.cs,自身由T4模板生成,無需修改

 

3.使用EF進行增刪改查

查詢

1 StudentMISEntities stu = new StudentMISEntities();
2 //IQueryable<Users> userInfoList=from u in stu.Users
3 var userInfoList = from u in stu.Users
4                    where u.id == 10
5                    select u;
6 foreach (var item in userInfoList)//EF延遲加載機制,數據用到的時候纔去數據庫中查詢,不用的時候不去查詢,提升程序性能
7 {
8       Response.Write(item.uName);
9 }

 

增長

1 Users userInfo = new Users();
2  userInfo.uName = "2333";
3  userInfo.uPassword = "123";
4  userInfo.uRole = "學生";
5 
6  StudentMISEntities stu = new StudentMISEntities();//建立EF數據操做類實例
7  stu.Users.Add(userInfo);//把數據添加到EF,並添加標記
8  stu.SaveChanges();//把數據保存到數據庫

 

修改

StudentMISEntities stu = new StudentMISEntities();
var userInfoList = from u in stu.Users
                   where u.id == 16
                   select u;
Users userInfo = userInfoList.FirstOrDefault();//返回第一個元素,若是沒有的話,返回null
if (userInfo!=null)
{
   userInfo.uPassword = "12345678";
   stu.Entry<Users>(userInfo).State = System.Data.Entity.EntityState.Modified;//添加修改標記
   stu.SaveChanges();
   Response.Write(userInfo.uPassword);
}
else
{
   Response.Write("要修改的數據不存在");
}

 

刪除

 1  StudentMISEntities stu = new StudentMISEntities();
 2  var userInfoList = from u in stu.Users  3                     where u.id == 17
 4                     select u;  5 Users userInfo = userInfoList.FirstOrDefault();//返回第一個元素,若是沒有的話,返回null
 6 if (userInfo!=null)
 7 {
 8    //stu.Users.Remove(userInfo);
 9    stu.Entry<Users>(userInfo).State = System.Data.Entity.EntityState.Deleted;//添加刪除標記
10    stu.SaveChanges();
11    Response.Write("已刪除");
12 }
13 else
14 {
15    Response.Write("要刪除的數據不存在");
16 }
相關文章
相關標籤/搜索