1、EF(Entity Framework)
實體框架EF是ADO.NET中的一組支持開發面向數據的軟件應用程序的技術,是微軟的一個ORM框架。
2、什么是ORM?
ORM指的是面向對象的對象模型和關系型數據庫的數據結構之間的互相轉換。
(表實體跟表之間的相互轉換)
ORM框架有很多,EF框架是ORM框架的其中一種,是實現了ORM思想的框架。
O=>表實體
M=>映射關系
R=>數據庫.表
3、創建EF,添加-新建項-ADO.NET 實體數據模型
<configuration>
<!--必須緊跟着configuration下面添加-->
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
</entityFramework>
<!--數據庫連接字符串,使用EF必須添加providerName="System.Data.EntityClient"-->
<connectionStrings>
<add name="ModelContainer" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=HX_Shop;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
4、簡單的EF使用入門
//創建EF上下文 Model.ModelContainer db = new Model.ModelContainer(); //下面有線程內實例唯一的例子 UserInfo info = new UserInfo(); info.Name = "張三"; db.UserInfo.Add(info); //添加數據 db.SaveChanges(); //最后必須SaveChanges()才能保存,把狀態的實體映射回數據庫。 //info.Id = 1; //修改或刪除操作,必須要有主鍵。 //db.Entry<T>(entity).State = EntityState.Added; //添加 //db.Entry<T>(entity).State = EntityState.Modified; //修改 //db.Entry<T>(entity).State = EntityState.Deleted; //刪除
4.1 EF4.0與EF5.0的寫法區別。
查看代碼
public T AddEntity(T entity) { //EF4.0的寫法 添加實體 //db.CreateObjectSet<T>().AddObject(entity); //EF5.0的寫法 db.Entry<T>(entity).State = EntityState.Added; //下面的寫法統一 db.SaveChanges(); return entity; } public bool UpdateEntity(T entity) { //EF4.0的寫法 //db.CreateObjectSet<T>().Addach(entity); //db.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified); //EF5.0的寫法 db.Set<T>().Attach(entity); db.Entry<T>(entity).State = EntityState.Modified; return db.SaveChanges() > 0; } public bool DeleteEntity(T entity) { //EF4.0的寫法 //db.CreateObjectSet<T>().Addach(entity); //db.ObjectStateManager.ChangeObjectState(entity, EntityState.Deleted); //EF5.0的寫法 db.Set<T>().Attach(entity); db.Entry<T>(entity).State = EntityState.Deleted; return db.SaveChanges() > 0; } public IQueryable<T> LoadEntities(Func<T, bool> whereLambda) { //EF4.0的寫法 //return db.CreateObjectSet<T>().Where<T>(whereLambda).AsQueryable(); //EF5.0的寫法 return db.Set<T>().Where<T>(whereLambda).AsQueryable(); } 執行SQL語句 //EF4.0的寫法 public int ExcuteSql(string sql, params ObjectParameter[] parameters) { return DbContext.ExecuteFunction(sql, parameters); } //EF5.0的寫法 public int ExecuteSql(string sql, params System.Data.SqlClient.SqlParameter[] pars) { return DbContext.Database.ExecuteSqlCommand(sql, pars); }
5、增刪改查練習
public class BaseRepository<T> where T:class,new () { private DbContext DbContext { get { return DbContextFactory.CreateDbContext(); //創建唯一實例。 } } //簡單查詢 public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda) { return DbContext.Set<T>().Where(whereLambda).AsQueryable(); } //分頁查詢 *** public IQueryable<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int totalCount, Expression<Func<T, bool>> whereLambda, bool isAsc, Expression<Func<T, S>> orderBy) { IQueryable<T> result = DbContext.Set<T>().Where(whereLambda).AsQueryable(); totalCount = result.Count(); //返回總記錄條數 if (isAsc) { result = result.OrderBy(orderBy) .Skip(pageSize * (pageIndex - 1)) .Take(pageSize) .AsQueryable(); } else { result = result.OrderByDescending(orderBy) .Skip(pageSize * (pageIndex - 1)) .Take(pageSize) .AsQueryable(); } return result; } public T Add(T entity) { DbContext.Set<T>().Add(entity); return entity; } public bool Detele(T entity) { DbContext.Entry(entity).State = EntityState.Deleted; return true; } public bool Update(T entity) { DbContext.Entry(entity).State = EntityState.Modified; return true; } }
6、EF支持Database First、Model First和Code Only三種開發模式
database first :從數據庫生成模型,先有數據庫,根據數據庫生成模型。
model first :由數據庫生成的實體對象模型,先設計模型,再生成數據庫。
code only : code first
http://www.cnblogs.com/fly_dragon/archive/2011/02/22/1961730.html
http://www.cnblogs.com/fcsh820/archive/2010/11/01/1866356.html
7、延遲加載機制
離線型的集合 <IQueryable>
延遲加載機制 用到這個集合時才會去加載數據(訪問數據庫)。
怎么避免延遲加載機制多次查詢數據庫的問題?
使用內存型集合ToList() List<T>
8、Linq、Lambda表達式學習
http://www.cnblogs.com/han1982/tag/LINQ/
備注:
1、使用EF框架,EF的表必須有主鍵,沒有會報錯。
2、報錯:對一個或多個實體的驗證失敗。實體屬性賦值問題。
3、EF性能差,比ADO.NET多一步生成sql腳本,實現復雜查詢生成的sql腳本。優點大於缺點。
3、EF上下文管理,保證線程內實例唯一。
//線程內部的一個內存空間
CallContext.SetData("DbContext") //設置
CallContext.GetData("DbContext") //獲取實例
HttpContext.Item["key"] 也是通過CallContext實現的
/// <summary> /// 保證EF的上下文。線程內實例唯一,一次請求一個實例、 /// </summary> public static class DbContextFactory { public static DbContext CreateDbContext() { //線程內實例唯一 DbContext db = (DbContext)HttpContext.Current.Items["DbContext"]; if (db == null) { db = new Model.ModelContainer(); HttpContext.Current.Items.Add("DbContext", db); } return db; } }
