[ASP.NET MVC]: - EF架構學習手記

來源:互聯網
上載者:User

標籤:des   style   blog   http   io   ar   color   os   使用   

1、EF(Entity Framework)
Entity FrameworkEF是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=&quot;data source=.;initial catalog=HX_Shop;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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);}
View Code


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;        }    }

 

[ASP.NET MVC]: - EF架構學習手記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.