Entity Framework基礎,entityframework
概述
Entity Framework簡稱EF,是微軟ORM思想具體實現的另一個產品。本篇部落格將簡單的介紹它,至於它的具體深層次的使用,大家可以查詢相應的操作手冊,該篇僅僅是入門。
Entity Framework和Linq to Sql的關係
大家都知道Linq to Sql是微軟ORM思想的一個具體產品,Entity Framework也是它的一個具體產品,那麼,這兩個產品有什麼區別呢?
Linq to Sql是ORM思想實現的一個輕量級的架構,Entity Framework是一個重量級架構;
Linq to Sql和Entity Framework的一個重要的區別就是,Linq to Sql只能針對於SQL Server資料庫,而Entity Framework可以針對於很多的資料庫(Oracle,SQL Server等),也就是說Entity Framework是跨資料庫的,不要小看這一點,在實際的開發中,非常的牛叉,下面我們舉例說明。
我們使用經典三層構建一個項目,我們需要寫自己的D層,如果此時我們換了資料庫,那麼,我們需要重寫D層。如果我們在建立這個項目的時候,使用了Linq to Sql,那麼我們的D層建立的非常的簡單,但是,當我們換資料庫的時候,Linq to Sql架構就不管用了;如果我們在建立這個項目的時候,使用了Entity Framework架構,那麼,我們只需要改一個設定檔就可以了,不需要修改程式中的代碼。
為什麼使用Linq to Sql或Entity Franework
回答這個問題,我們就要說一說D層存在的問題了。
我們寫D層的時候,我們通常會抽象出來一個SQLHelper類,這個類實現了對資料庫的增刪查改,然後,我們再建立相應的D層類,這些D層類裡面的方法的功能,其實都一樣,唯一不同的就是SQL,從這裡我們可以看到,我們的D層的問題,那就是,我們重複性的書寫一些不必要的類或者方法,解決這個方法就需要慢慢的抽象,抽象出共有的東西,像:DataTable裝換為實體集,操作資料庫的幾類方法(注意其參數),然後將其一整合,這個大致就是我們所屬的ORM思想實現的雛形了,當然,上面所說的那些東西,Linq to Sql或Entity Framework這些架構已經協助我們實現了,我們只需要使用它們提供的方法就行了,從這裡我們也可以看到,如果我們使用這些架構,我們程式員在編程的時候,幾乎不需要管理D層的東西,只需要關注業務的實現就可以了。
Entity Framework的執行個體SQL指令碼
CREATE DATABASE DBFirstGOUSE DBFirstGOCREATE TABLE T_Customer(ID INT PRIMARY KEY IDENTITY(1,1),CusName VARCHAR(20) NOT NULL)CREATE TABLE T_Order(ID INT PRIMARY KEY IDENTITY(1,1),CustomerID INT FOREIGN KEY REFERENCES T_Customer(ID),DepName VARCHAR(20) NOT NULL)
程式碼
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;namespace EF.EntityFrameworkDemo{ class Program { static void Main(string[] args) { #region 添加實體 ////建立內容物件 //DBFirstEntities dbFirst = new DBFirstEntities(); ////操作實體 //T_Customer customer = new T_Customer(); //customer.CusName = "新添使用者"; ////附加在上下文 //dbFirst.T_Customer.AddObject(customer); ////儲存 //dbFirst.SaveChanges(); #endregion #region 刪除實體 ////1、建立內容物件 //DBFirstEntities dbFirst = new DBFirstEntities(); ////2、建立實體 //T_Customer customer = new T_Customer(); //customer.ID = 9; ////3、將實體附加到上下文裡面來進行管理 //dbFirst.T_Customer.Attach(customer); ////修改實體的狀態 //dbFirst.ObjectStateManager.ChangeObjectState(customer, EntityState.Deleted); ////4、上下文操作資料庫 //dbFirst.SaveChanges(); #endregion #region 修改實體 ////1、建立訪問資料庫的內容物件 //DBFirstEntities dbFirst = new DBFirstEntities(); ////2、修改對象 //T_Customer customer = new T_Customer(); //customer.ID = 4; //customer.CusName = "使用者4_修改後2"; ////3、附加到資料庫 //dbFirst.T_Customer.AddObject(customer); ////修改對象狀態 //dbFirst.ObjectStateManager.ChangeObjectState(customer, EntityState.Modified); ////4、上下文更新資料庫 //dbFirst.SaveChanges(); #endregion #region 查詢 DBFirstEntities dbFirst = new DBFirstEntities(); foreach (var item in dbFirst.T_Customer) { Console.WriteLine(string.Format("ID:{0} Name:{1}",item.ID,item.CusName)); } #region linq運算式 T_Customer cs = (from customer in dbFirst.T_Customer where customer.ID == 2 select customer).SingleOrDefault(); Console.WriteLine("ID:{0} Name:{1}",cs.ID,cs.CusName); #endregion #endregion Console.ReadKey(); } }}
總結
EF的使用大致可以分為:DBFirst(資料庫為中心)和ModelFirst(實體為中心),上面是DBFirst模型,至於ModelFirst,大家可以搜一下。
Entity Framework於ADONet相比有什優勢?
就目前而言,使用EntityFramework還不如使用NHibernate
Entity Framework的優勢就是擁有更好的LINQ提供者、文檔,並且是由微軟所支援的。
但NHibernate具有大量Entity Framework 4.0所不具備的特性,像批量讀/寫、“額外的”延遲、集合過濾器、調整等等。
ORM工具的普遍開發速度快
但個人基本不用這些ORM工具,對於一個要求高效能、高可靠性、高並發,分布式的web應用程式,自己寫ADO.NET最起碼能保證資料訪問可控。
Entity Framework於ADONet相比有什優勢?
就目前而言,使用EntityFramework還不如使用NHibernate
Entity Framework的優勢就是擁有更好的LINQ提供者、文檔,並且是由微軟所支援的。
但NHibernate具有大量Entity Framework 4.0所不具備的特性,像批量讀/寫、“額外的”延遲、集合過濾器、調整等等。
ORM工具的普遍開發速度快
但個人基本不用這些ORM工具,對於一個要求高效能、高可靠性、高並發,分布式的web應用程式,自己寫ADO.NET最起碼能保證資料訪問可控。