C#學習-EF在三層中使用

來源:互聯網
上載者:User

標籤:

1.搭建普通三層

DAL層,BLL層,Model層,Web層;

DAL層引用Model層

BLL層引用DAL層和Model層

Web層引用BLL層和Model層

2.實現EF三層的搭建(添加引用,修改配置資訊)

2.1添加EF對象

在Model中添加一個ADO.NET實體資料集

2.2添加引用資訊

在DAL層中添加引用,EntityFramework.dll在你建立的解決方案檔案夾下的packages檔案夾中。

這裡有個注意:

添加的時候看看引用的EntityFramework.dll的版本是否跟Model中的EntityFramework.dll版本號碼相同,如果不同的話會出錯。 右擊dll,查看屬性就可以看到詳細資料。

2.3修改配置資訊

將Model中的App.config與EntityFramework相關的配置全部複製過來,發現是在configuration根節點下

然後在Web層中的Web.config中,找到節點<configuration></configuration>將上面三部分代碼黏貼在最上端

3.寫Model層代碼

因為用的是DBFirst,所以EF自動為我們產生了Model層,

4.寫DAL層代碼

4.1先書寫具體某個對象的DAL方法

class User{    //建立資料內容    static Model.MyDBEntities context = new MyDBEntities();    /// <summary>    /// 添加 實體    /// </summary>    /// <param name="model">傳入一個實體</param>    /// <returns></returns>    public int Add(Model.Users model)    {        context.Users.Add(model);        return context.SaveChanges();    }    /// <summary>    /// 根據條件 刪除 資料    /// </summary>    /// <param name="id"></param>    /// <returns></returns>    public int Del(Model.Users model)    {        context.Users.Attach(model);        context.Users.Remove(model);        return context.SaveChanges();    }    /// <summary>    /// 修改 資料    /// </summary>    /// <param name="model">要修改成的資料</param>    /// <param name="proName">要修改的列名</param>    /// <returns></returns>    public int Modify(Model.Users model, params string[] proName)    {        DbEntityEntry<Model.Users> entityEntry = context.Entry<Model.Users>(model);        entityEntry.State = EntityState.Unchanged;        foreach (string s in proName)        {            //將要修改的列 標識為修改            entityEntry.Property(s).IsModified = true;        }        return context.SaveChanges();    }    /// <summary>    /// 分頁查詢    /// </summary>    /// <typeparam name="TKey">排序的欄位的類型</typeparam>    /// <param name="orderLambda">按上面方式排序,升序還是降序</param>    /// <param name="whereLambda">分頁的Where條件</param>    /// <param name="pagesize">每頁多少條資料</param>    /// <param name="pageIndex">當前第幾頁</param>    /// <returns></returns>    public List<Model.Users> GetPageList<TKey>(Expression<Func<Model.Users, TKey>> orderLambda, Expression<Func<Model.Users, bool>> whereLambda, int pagesize, int pageIndex)    {        return context.Users.Where(whereLambda)            .OrderBy(orderLambda)            .Skip((pageIndex - 1) * pagesize)            .Take(pagesize)            .Select(u => u).ToList();    }}

因為其他對象,也是使用類似的方法,這個時候就想到了泛型,將以上方法修改成泛型,改寫成一個DAL的基類,代碼如下

/// <summary>/// T為參考型別,且有個無參的建構函式/// </summary>/// <typeparam name="T"></typeparam>public class BaseDAL<T> where T:class ,new(){    static Model.MyDBEntities context = new MyDBEntities();      public int Add(T model)    {        context.Set<T>().Add(model);        return context.SaveChanges();    }    public int Del(T model)    {        context.Set<T>().Attach(model);        context.Set<T>().Remove(model);        return context.SaveChanges();    }    public int Modify(T model, params string[] proName)    {        DbEntityEntry<T> entityEntry = context.Entry<T>(model);        entityEntry.State = EntityState.Unchanged;        foreach (string s in proName)        {            entityEntry.Property(s).IsModified = true;        }        return context.SaveChanges();    }     public List<T> GetPageList<TKey>(Expression<Func<T, TKey>> orderLambda, Expression<Func<T, bool>> whereLambda, int pagesize, int pageIndex)    {        return context.Set<T>().Where(whereLambda)            .OrderBy(orderLambda)            .Skip((pageIndex - 1) * pagesize)            .Take(pagesize)            .Select(u => u).ToList();    } }

建立其他對象的DAL層方法時,只要繼承父類就可以了

5.寫BLL層方法

BLL層方法,就是把DAL層方法複製過來,然後去掉方法體,就可以了

public class BaseBLL<T> where T:class,new(){    BaseDAL<T> dal=new BaseDAL<T>();       public int Add(T model)    {        return dal.Add(model);    }     public int Del(T model)    {        return dal.Del(model);    }      public int Modify(T model, params string[] proName)    {        return dal.Modify(model, proName);    }    public List<T> GetPageList<TKey>(Expression<Func<T, TKey>> orderLambda, Expression<Func<T, bool>> whereLambda, int pagesize, int pageIndex)    {        return dal.GetPageList(orderLambda, whereLambda, pagesize, pageIndex);    } }

建立其他對象的BLL方法時,只要繼承父類就行了。

6.三層的擴充

通過上面步驟,我們搭建好了三層,建立了如下四個類

這個時候,如果在DAL中的User.cs中有個自己方法SayHello()

我們在BLL層中的User.cs,只是繼承了BaseBLL.cs;而BaseBLL.cs中不存在SayHello()方法

也就是是說用上面的這幾個步驟,還不能實現調用User.cs中的自己方法,

如果能獲得DAL中User的對象就好了,就可以直接調用SayHello()方法了

那就在BLL父類中,定義一個操作DAL.User的資料操作對象;
然後通過調用該資料操作對象的方法,來調用SayHello()方法;
既然定義了一個DAL.User對象,就要執行個體化後才可使用,
但是父類中,無法確定要執行個體化的是哪一個類,那麼就想到了在子類中對父類中的資料操作對象進行執行個體化;
因為不同子類,類型不同,初始化對象的方法也不一樣,所以想到了抽象函數,沒有方法體;

通過上面整理,得到添加的代碼如下:

BaseBLL.cs

BLL層中的User.cs

DAL層中User.cs

C#學習-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.