文章出處

一、創建項目解決方案

image

1.model層、BLL層、Dal層、Common層,都是類庫

image

2.UI層使用MVC5

image

二、使用EF鏈接數據庫

1.創建實體數據模型

image

2.選擇來自數據庫EF設計器

image

3.創建數據庫鏈接

image

4.選是,點擊下一步,選擇實體框架6.x,下一步選擇要創建的表

image

image

image

三、創建Dal層中鏈接數據庫操作并實現查詢父類與子類

1.在Dal層創建一個BaseDBContext類,用來自定義EF上下文,首先引用EF框架。備注:Dal層需要應用model層。

image

BaseDBContext類:

  1 namespace Wchl.EFDal
  2 {
  3     /// <summary>
  4     /// 自定義的EF上下文容器類
  5     /// </summary>
  6     public class BaseDBContext: DbContext
  7     {
  8         /// <summary>
  9         /// 負責根據指定的數據庫鏈接字符串,初始化EF
 10         /// </summary>
 11         public BaseDBContext() : base("name=DonationEntities") { }
 12     }
 13 }
View Code

2.創建BaseDal類來存放每個類中共有的方法:查詢、新增、編輯、刪除、執行Sql語句。

2.1這里先實現一個查詢的方法,然后接下來在擴充

BaseDal類:

  1 namespace Wchl.EFDal
  2 {
  3     /// <summary>
  4     /// 負責操作數據庫中的所有表的普通增,刪,查,改操作的
  5     /// </summary>
  6     /// <typeparam name="TEntity"></typeparam>
  7     public class BaseDal<TEntity> where TEntity:class
  8     {
  9         //1.0實例化EF上下文容器對象
 10         BaseDBContext db = new BaseDBContext();
 11 
 12         DbSet<TEntity> _dbset;
 13 
 14         public BaseDal()
 15         {
 16             //初始化
 17             _dbset = db.Set<TEntity>();
 18         }
 19 
 20         #region 查詢
 21         public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
 22         {
 23             return _dbset.Where(where).ToList();
 24         }
 25         #endregion
 26 
 27     }
 28 }
View Code

2.2創建CompanyDal類和DonationDetailDal來繼承BaseDal

CompanyDal類:

  1 namespace Wchl.EFDal
  2 {
  3      public class CompanyDal:BaseDal<Company>
  4     {
  5     }
  6 }
View Code

DonationDetailDal類:

  1 namespace Wchl.EFDal
  2 {
  3     public class DonationDetailDal:BaseDal<DonationDetail>
  4     {
  5         //可以各自類的獨有的方法
  6     }
  7 }
View Code

四、在BLL層來調用Dal層 需要應用model層

4.1創建BaseBLL類做為基類,并且調用dal中查詢的方法

  1 namespace Wchl.EFBLL
  2 {
  3     public class BaseBLL<TEntity> where TEntity:class
  4     {
  5         //初始化BaseDal泛型類的對象
  6         BaseDal<TEntity> bdal = new BaseDal<TEntity>();
  7 
  8         public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
  9         {
 10             return bdal.Query(where);
 11         }
 12     }
 13 }
View Code

4.2創建CompanyBLL類和DonationDetailBLL類來幾層父類

DonationDetailBLL類:

  1 namespace Wchl.EFBLL
  2 {
  3     public class DonationDetailBLL:BaseBLL<DonationDetail>
  4     {
  5     }
  6 }
View Code

CompanyBLL類:

  1 namespace Wchl.EFBLL
  2 {
  3     public class CompanyBLL:BaseBLL<Company>
  4     {
  5     }
  6 }
View Code

五、UI層調用bl層l和model層,在home控制器下創建一個test方法 創建視圖Views

5.1 創建Test方法

  1         public ActionResult Test()
  2         {
  3             CompanyBLL cbll = new CompanyBLL();
  4 
  5             return View(cbll.Query(c=>true));
  6         }
View Code

5.2在創建視圖的時候使用布局頁,并選擇list模板,模型類選擇Company (Wchl.EFModel)

image

5.3 然后在model層中的App.Config文件中把數據庫鏈接,拷貝到UI層Web.config中

image

image

5.4運行http://localhost:15725/home/test頁面,數據就會顯示了

image

 

六、完善DAL層中的BaseDal類 實現關聯查詢、刪除、編輯、新增、統一保存的方法

BaseDal類:

  1 namespace Wchl.EFDal
  2 {
  3     /// <summary>
  4     /// 負責操作數據庫中的所有表的普通增,刪,查,改操作的
  5     /// </summary>
  6     /// <typeparam name="TEntity"></typeparam>
  7     public class BaseDal<TEntity> where TEntity:class
  8     {
  9         //1.0實例化EF上下文容器對象
 10         BaseDBContext db = new BaseDBContext();
 11 
 12         DbSet<TEntity> _dbset;
 13 
 14         public BaseDal()
 15         {
 16             //初始化
 17             _dbset = db.Set<TEntity>();
 18         }
 19 
 20         #region 查詢
 21         public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
 22         {
 23             return _dbset.Where(where).ToList();
 24         }
 25 
 26         public List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> where,string[] tableNames)
 27         {
 28             //將子類_dbset 賦值給父類的query
 29             DbQuery<TEntity> query = _dbset;
 30 
 31             foreach (var item in tableNames)
 32             {
 33                 //遍歷要連表的表名稱,最終得到所有連表以后的DbQuery對象
 34                 query = query.Include(item);
 35             }
 36             return query.Where(where).ToList();
 37         }
 38         #endregion
 39 
 40         #region 新增
 41         public void Add(TEntity model)
 42         {
 43             _dbset.Add(model);
 44         }
 45         #endregion
 46 
 47         #region 編輯
 48         public void Edit(TEntity model,string[] propertyName)
 49         {
 50             if (model == null)
 51             {
 52                 throw new Exception("model必須為實體的對象");
 53             }
 54             if (propertyName == null || propertyName.Any() == false)
 55             {
 56                 throw new Exception("必須至少指定一個要修改的屬性");
 57             }
 58 
 59             //將model追加到EF容器
 60             DbEntityEntry entry = db.Entry(model);
 61 
 62             entry.State = EntityState.Unchanged;
 63 
 64             foreach (var item in propertyName)
 65             {
 66                 entry.Property(item).IsModified = true;
 67             }
 68         }
 69         #endregion
 70 
 71         #region 物理刪除
 72         //EntityState.Unchanged
 73         public void Delete(TEntity model, bool isAddedEFContext)
 74         {
 75             if (isAddedEFContext == false)
 76             {
 77                 _dbset.Attach(model);
 78             }
 79             //修改狀態為deleted
 80             _dbset.Remove(model);
 81         }
 82         #endregion
 83 
 84         #region 統一執行保存
 85         public int SaveChanges()
 86         {
 87             return db.SaveChanges();
 88         }
 89         #endregion
 90 
 91     }
 92 }
View Code

七、完善BLL層BaseBLL類的方法

BaseBLL類:

  1 namespace Wchl.EFBLL
  2 {
  3     public class BaseBLL<TEntity> where TEntity:class
  4     {
  5         //初始化BaseDal泛型類的對象
  6         BaseDal<TEntity> bdal = new BaseDal<TEntity>();
  7         #region 查詢
  8         public List<TEntity> Query(Expression<Func<TEntity, bool>> where)
  9         {
 10             return bdal.Query(where);
 11         }
 12 
 13         public List<TEntity> QueryJoin(Expression<Func<TEntity, bool>> where, string[] tableNames)
 14         {
 15             return bdal.QueryJoin(where, tableNames);
 16         }
 17         #endregion
 18 
 19         #region  新增
 20 
 21         public void Add(TEntity model)
 22         {
 23             bdal.Add(model);
 24         }
 25 
 26         #endregion
 27 
 28         #region  編輯
 29 
 30         /// <summary>
 31         /// 要求:model必須是自己定義的實體,此時沒有追加到EF容器中
 32         /// </summary>
 33         /// <param name="model"></param>
 34         public void Edit(TEntity model, string[] propertyName)
 35         {
 36             bdal.Edit(model, propertyName);
 37         }
 38 
 39         #endregion
 40 
 41         #region  物理刪除
 42 
 43         /// <summary>
 44         /// model必須是自己定義的,一般是按照主鍵來刪除
 45         /// </summary>
 46         /// <param name="model">要刪除的實體對象</param>
 47         /// <param name="isAddedEFContext">true:表示model以及追加到了ef容器,false:未追加</param>
 48         public void Delete(TEntity model, bool isAddedEFContext)
 49         {
 50             bdal.Delete(model, isAddedEFContext);
 51         }
 52 
 53         #endregion
 54 
 55         #region 統一執行sql語句
 56 
 57         public int SaveChanges()
 58         {
 59             return bdal.SaveChanges();
 60         }
 61 
 62         #endregion
 63 
 64     }
 65 }
View Code

八、mvc調用測試

  1   public ActionResult Test()
  2         {
  3             CompanyBLL cbll = new CompanyBLL();
  4 
  5             //新增測試:
  6             Company model = new Company()
  7             {
  8                 CName = "測試1111111"
  9             };
 10             cbll.Add(model);
 11 
 12             //修改
 13             //Company model1 = new Company()
 14             //{
 15             //    cID = 8,
 16             //    CName = "測試22221"
 17             //};
 18 
 19             //cbll.Edit(model1, new string[] { "CName" });
 20 
 21 
 22             //刪除
 23             var model2 = cbll.Query(c => c.cID == 8).FirstOrDefault();
 24             cbll.Delete(model2, true);//執行sql語句 打開關閉了一次ado.net鏈接
 25 
 26             //統一將上面的新增,編輯,刪除分別生成insert,update,delete語句一次性發送給數據庫執行
 27             cbll.SaveChanges();
 28 
 29 
 30 
 31             return View(cbll.Query(c=>true));
 32         }
View Code

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()