一、創建項目解決方案
1.model層、BLL層、Dal層、Common層,都是類庫
2.UI層使用MVC5
二、使用EF鏈接數據庫
1.創建實體數據模型
2.選擇來自數據庫EF設計器
3.創建數據庫鏈接
4.選是,點擊下一步,選擇實體框架6.x,下一步選擇要創建的表
三、創建Dal層中鏈接數據庫操作并實現查詢父類與子類
1.在Dal層創建一個BaseDBContext類,用來自定義EF上下文,首先引用EF框架。備注:Dal層需要應用model層。
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 }
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 }
2.2創建CompanyDal類和DonationDetailDal來繼承BaseDal
CompanyDal類:

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

1 namespace Wchl.EFDal 2 { 3 public class DonationDetailDal:BaseDal<DonationDetail> 4 { 5 //可以各自類的獨有的方法 6 } 7 }
四、在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 }
4.2創建CompanyBLL類和DonationDetailBLL類來幾層父類
DonationDetailBLL類:

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

1 namespace Wchl.EFBLL 2 { 3 public class CompanyBLL:BaseBLL<Company> 4 { 5 } 6 }
五、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 }
5.2在創建視圖的時候使用布局頁,并選擇list模板,模型類選擇Company (Wchl.EFModel)
5.3 然后在model層中的App.Config文件中把數據庫鏈接,拷貝到UI層Web.config中
5.4運行http://localhost:15725/home/test頁面,數據就會顯示了
六、完善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 }
七、完善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 }
八、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 }
文章列表