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 的通用代碼如下。

  

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

  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 }

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

 

4.關(guān)于如何實(shí)現(xiàn)以上接口的方法。如下面代碼所示。當(dāng)然你也可以將進(jìn)行實(shí)例化對(duì)象這里進(jìn)行采用簡(jiǎn)單工廠 或者抽象工廠 全憑個(gè)人想法。

  

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

  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