一、創建項目解決方案
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 }
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 }















