1. Entity Framework是Microsoft的ORM框架,隨著 Entity Framework 不斷的完善強(qiáng)化已經(jīng)到達(dá)了EF 6.0+ 還是非常的完善的,目前使用的比例相對(duì)于其他ORM 的框架還是比較多的。例如有我們目前使用較多的是EF和Drapper 和SQL Sugar 以及NHibernate 當(dāng)然NHibernate 我使用的不多。當(dāng)然EF確實(shí)使用起來(lái)非常的方便開(kāi)發(fā)的速度是比較快的,EF 畢竟在Microsoft 在.NET 體系中已經(jīng)推出了多年了,無(wú)論是成熟度還是其中的性能以及優(yōu)化的程度都得到了很好很大的改善, 所以還是非常值得我們學(xué)習(xí)使用,當(dāng)然我這個(gè)不是吹噓EF 好,而且有的朋友也說(shuō)了 EF 性能不好效率不高,我想詢問(wèn)一下 針對(duì)于這些問(wèn)題你想過(guò)如何進(jìn)行優(yōu)化 以及改進(jìn)沒(méi)有其實(shí)目前改進(jìn)的方案網(wǎng)上還是非常多的,當(dāng)然也有很多開(kāi)發(fā)者為EF提供了擴(kuò)展功能,如Entity Framework Extended 等里面封裝的一些方法就是非常好使用的。而且作為.NET 開(kāi)發(fā)者來(lái)說(shuō)項(xiàng)目的通用性也是非常的強(qiáng)大的,資料也是非常多的,Microsoft在這塊的更新力度也很給力。Entity Framework 提供了三種開(kāi)發(fā)模式,Code Frist,Database-First,Model-First。 目前采用Code Frist 的比較多一些 ,但是我建議大家可以使用DB Frist 簡(jiǎn)單好用。操作方便。當(dāng)然你如果你喜歡Code Frist 也是擁有自己的好處,反正三者之間 都是相通的,沒(méi)有什么難點(diǎn)的。都是ORM 之間的轉(zhuǎn)化。
Database-First模式明顯性能會(huì)差點(diǎn),非常的適合初學(xué)者,或者是比較急的中小型項(xiàng)目一般情況下使用還是足夠的。(數(shù)據(jù)量200W左右還是足夠應(yīng)付的)。
Model-First模式優(yōu)點(diǎn)是開(kāi)發(fā)人員能夠在設(shè)計(jì)模型時(shí)完全了解數(shù)據(jù)庫(kù)的結(jié)構(gòu)以及表格之間的關(guān)系,但是缺點(diǎn)是在模型設(shè)計(jì)完后,還是需要去手動(dòng)創(chuàng)建數(shù)據(jù)庫(kù),而且生成的腳本有點(diǎn)不簡(jiǎn)潔。
Code-First模式有點(diǎn)不用說(shuō)了,就是上面兩個(gè)模式的缺點(diǎn)。缺點(diǎn)應(yīng)該也是有很多的,比如更新數(shù)據(jù)庫(kù)。涉及到數(shù)據(jù)的遷移這一塊。就讓大多數(shù)人比較頭疼。目前解決的方案比較多。
這個(gè)這個(gè)只是我個(gè)人的意見(jiàn)和看法 。所以關(guān)于這個(gè)EF 的開(kāi)發(fā)模式的如何的使用,決定權(quán)利在于你的項(xiàng)目和數(shù)據(jù)庫(kù)數(shù)據(jù)量大小和你公司的目前存在的框架。
2. 關(guān)于我個(gè)人封裝的通用的EF 比較簡(jiǎn)單好用就是正對(duì)于數(shù)據(jù)庫(kù)的CRUD ,而且非常適合于單個(gè)數(shù)據(jù)庫(kù)的讀寫的操作。 當(dāng)然你也可以進(jìn)行對(duì)于數(shù)據(jù)庫(kù)進(jìn)行讀寫分離的操作,建立相互對(duì)應(yīng)的數(shù)據(jù)庫(kù)的集群,那么其實(shí)說(shuō)白了 EF本身就是一個(gè)對(duì)于CRUD 的讀寫的操作。使用過(guò)EF的人知道,EF提供訪問(wèn)數(shù)據(jù)庫(kù)的是 DbContext 這個(gè)對(duì)象,所以想實(shí)現(xiàn)讀寫分離的就很簡(jiǎn)單了,只要在程序中使用兩個(gè)不同的DbContext對(duì)象,一個(gè)負(fù)責(zé)讀,一個(gè)負(fù)責(zé)寫就好了。當(dāng)然你也可以進(jìn)行使用相對(duì)應(yīng)的工廠化模式進(jìn)行 讀寫分離的操作也可以通過(guò) 常用的反射來(lái)進(jìn)行讀寫的操作,決定權(quán)取決在你的手上。所以我們?cè)谑褂闷渲械淖x寫分離的時(shí)候你只管進(jìn)行對(duì)于 DbContext 進(jìn)行操作就是了 建立相互對(duì)于的讀寫的類就可以了。 一般讀寫進(jìn)行分離的都是進(jìn)行同步于主庫(kù)的。因?yàn)橐话闱闆r下的讀寫的分離 都是一主多從庫(kù)的模式。
3.在使用這個(gè)通用EF CRUD 類的時(shí)候需要 進(jìn)行添加EntityFramework.Extended.6.1.0.168 EntityFramework 6.1.3 兩個(gè)程序集 。當(dāng)然 我這里使用的是MySQL 數(shù)據(jù)庫(kù) 所以還添加MySQL Data Entity 的等等。添加以上引用的程序集 就可以了。然后還需要添加相對(duì)應(yīng)的Transaction的程序集,這個(gè)時(shí)候有的朋友就問(wèn)了 添加Transaction做什么 我的目的就是通過(guò)建立想對(duì)應(yīng)的事務(wù)來(lái)進(jìn)行回滾 處理簡(jiǎn)單的并發(fā) 要做全部都做,要么全部都不做。如果你采用Queue 來(lái)進(jìn)行解決并發(fā)那就更好了。其中關(guān)于EF 的CRUD 的通用代碼如下。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq.Expressions; 4 using System.Data; 5 using MySql.Data.MySqlClient; 6 /************************************************ 7 ◇作者: LowKeyC 8 ◇說(shuō)明: 定義一個(gè)EF通用的CRUD的接口 9 ◇版本號(hào):V1.0 10 ◇創(chuàng)建日期:2017年6月22日 星期四 11 *****************************************************/ 12 13 namespace EFCommon.SqlHelp 14 { 15 public interface IRepository : IDisposable 16 { 17 18 /// <summary> 19 /// 添加實(shí)體 20 /// </summary> 21 /// <typeparam name="T"></typeparam> 22 /// <param name="Entity"></param> 23 /// <returns></returns> 24 bool Add<T>(T Entity) where T : class; 25 26 /// <summary> 27 /// 批量的進(jìn)行添加實(shí)體 28 /// </summary> 29 /// <typeparam name="T"></typeparam> 30 /// <param name="Entity"></param> 31 /// <returns></returns> 32 bool AddRange<T>(List<T> Entity) where T : class; 33 34 35 /// <summary> 36 /// 刪除單個(gè)實(shí)體 37 /// </summary> 38 /// <typeparam name="T"></typeparam> 39 /// <param name="Entity"></param> 40 /// <returns></returns> 41 bool Delete<T>(T Entity) where T : class; 42 43 /// <summary> 44 /// 根據(jù)查詢條件進(jìn)行刪除單個(gè)實(shí)體 45 /// </summary> 46 /// <typeparam name="T"></typeparam> 47 /// <param name="whereLambda"></param> 48 /// <returns></returns> 49 bool Delete<T>(Expression<Func<T, bool>> whereLambda) where T : class; 50 51 52 /// <summary> 53 ///單個(gè)對(duì)象的修改 54 /// </summary> 55 /// <typeparam name="T"></typeparam> 56 /// <param name="Entity">需要修改的對(duì)象</param> 57 /// <returns></returns> 58 bool Update<T>(T Entity) where T : class; 59 60 61 /// <summary> 62 /// 批量修改 63 /// </summary> 64 /// <typeparam name="T"></typeparam> 65 /// <param name="whereLambda"></param> 66 /// <param name="updateLambda"></param> 67 /// <returns></returns> 68 bool Update<T>(Expression<Func<T, bool>> WhereLambda, Expression<Func<T, T>> UpdateLambda) where T : class; 69 70 71 /// <summary> 72 /// 批量的修改 73 /// </summary> 74 /// <typeparam name="T"></typeparam> 75 /// <param name="Entity"></param> 76 /// <returns></returns> 77 bool Update<T>(List<T> Entity) where T : class; 78 79 80 /// <summary> 81 /// 批量統(tǒng)一的進(jìn)行更新 82 /// </summary> 83 /// <typeparam name="T"></typeparam> 84 /// <param name="model">需要修改的對(duì)象實(shí)體</param> 85 /// <param name="WhereLambda">查詢的條件</param> 86 /// <param name="ModifiedProNames"></param> 87 /// <returns></returns> 88 bool Update<T>(T model, Expression<Func<T, bool>> WhereLambda, params string[] ModifiedProNames) where T : class; 89 90 91 /// <summary> 92 /// 根據(jù)主鍵進(jìn)行查詢 93 /// </summary> 94 /// <typeparam name="T"></typeparam> 95 /// <param name="ID"></param> 96 /// <returns></returns> 97 T FindByID<T>(dynamic ID) where T : class; 98 99 /// <summary>100 /// 默認(rèn)查詢選擇第一條數(shù)據(jù),沒(méi)有那么進(jìn)行返回NULL101 /// </summary>102 /// <typeparam name="T"></typeparam>103 /// <param name="WhereLambda"></param>104 /// <returns>返回bool</returns>105 T GetFristDefault<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class;106 107 /// <summary>108 /// 查詢所有的數(shù)據(jù)109 /// </summary>110 /// <typeparam name="T"></typeparam>111 /// <returns></returns>112 List<T> GetAll<T>(string Order = null) where T : class;113 114 /// <summary>115 /// 含有帶條件的查詢116 /// </summary>117 /// <typeparam name="T"></typeparam>118 /// <param name="WhereLambda"></param>119 /// <returns></returns>120 List<T> GetAllQuery<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class;121 122 123 /// <summary>124 ///獲取查詢的數(shù)量125 /// </summary>126 /// <typeparam name="T"></typeparam>127 /// <param name="WhereLambda"></param>128 /// <returns></returns>129 int GetCount<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class;130 131 /// <summary>132 /// 判斷對(duì)象是否存在133 /// </summary>134 /// <typeparam name="T"></typeparam>135 /// <param name="WhereLambda"></param>136 /// <returns></returns>137 bool GetAny<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class;138 139 140 /// <summary>141 /// 根據(jù)查詢過(guò)條件進(jìn)行分頁(yè)142 /// </summary>143 /// <typeparam name="T"></typeparam>144 /// <typeparam name="TKey"></typeparam>145 /// <param name="PageIndex">當(dāng)前頁(yè)面</param>146 /// <param name="PageSize">頁(yè)面的大小</param>147 /// <param name="TotalCount">總記錄數(shù)</param>148 /// <param name="OrderBy">排序的條件</param>149 /// <param name="WhereLambda">查詢條件</param>150 /// <param name="IsOrder">是否正序</param>151 /// <returns></returns>152 List<T> Pagination<T, TKey>(int PageIndex, int PageSize, out int TotalCount, Expression<Func<T, TKey>> OrderBy, Expression<Func<T, bool>> WhereLambda = null, bool IsOrder = true) where T : class;153 154 155 /// <summary>156 /// 根據(jù)查詢條件進(jìn)行做分頁(yè)查詢157 /// </summary>158 /// <typeparam name="T">查詢的對(duì)象</typeparam>159 /// <param name="PageIndex">當(dāng)前的頁(yè)碼</param>160 /// <param name="PageSize">每頁(yè)的大小</param>161 /// <param name="TotalCount">總頁(yè)數(shù)</param>162 /// <param name="ordering">排序條件</param>163 /// <param name="WhereLambda">查詢條件</param>164 /// <returns></returns>165 List<T> Pagination<T>(int PageIndex, int PageSize, out int TotalCount, string ordering, Expression<Func<T, bool>> WhereLambda = null) where T : class;166 167 168 /// <summary>169 /// 根據(jù)查詢條件進(jìn)行轉(zhuǎn)化170 /// </summary>171 /// <typeparam name="T"></typeparam>172 /// <param name="WhereLambda"></param>173 /// <returns></returns>174 List<T> GetSelect<T>(Expression<Func<T, bool>> WhereLambda) where T : class;175 176 177 /// <summary>178 /// 執(zhí)行存儲(chǔ)過(guò)程或自定義sql語(yǔ)句--返回集合179 /// </summary>180 /// <typeparam name="T"></typeparam>181 /// <param name="Sql"></param>182 /// <param name="Parms"></param>183 /// <param name="CmdType"></param>184 /// <returns></returns>185 List<T> QueryPro<T>(string Sql, List<MySqlParameter> Parms, CommandType CmdType = CommandType.Text) where T : class;186 187 188 /// <summary>189 /// 回滾190 /// </summary>191 /// <typeparam name="T"></typeparam>192 void RollBackChanges<T>() where T : class;193 194 }195 }
4.關(guān)于如何實(shí)現(xiàn)以上接口的方法。如下面代碼所示。當(dāng)然你也可以將進(jìn)行實(shí)例化對(duì)象這里進(jìn)行采用簡(jiǎn)單工廠 或者抽象工廠 全憑個(gè)人想法。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Transactions; 6 using System.Data.Entity; 7 using System.Linq.Expressions; 8 using System.Data; 9 using System.Linq.Dynamic; 10 using EntityFramework.Extensions; 11 using System.Reflection; 12 using System.Data.Entity.Infrastructure; 13 using MySql.Data.MySqlClient; 14 /************************************************ 15 ◇作者: LowKeyC 需要引用這個(gè)程序集:EntityFramework.Extended.6.1.0.168 16 ◇說(shuō)明: 實(shí)現(xiàn)EF通用的CRUD
http://www.cnblogs.com/LowKeyCXY/p/7170728.html