EF:重量級ORM的代表
優點:
1、不關心sql怎么寫,
2、開發速度快,和linq結合,有效提高開發效率
3、code first,代碼優先,不用關心數據庫結構,代碼先行。
4、跨數據庫,只需要把連接字符串改一下就可成功切換數據庫
5、與vs結合的比較好。
缺點:
1.比較復雜,學習曲線大。
2.不適合統計查詢系統,效率不是很高。
3.對於多表聯查,一些復雜的查詢實現比較復雜和困難,而且有可能要借助其他方案來實現。
4.自動生成的sql查詢效率略低(效率低,數據量達到一定量級比較明顯)
5.對於大量數據,高負載場景需要慎重使用。
6.實現良好的耳機緩存很困難,並且只能定制。
7.EF的Context上下文不是線程安全的,開發人員切記不應該在整個Service上使用一個Context上下文。
8.EF的性能表現比較一般。性能不如ADO,無法控制SQL語句的生成,頻繁的插入操作不適用,EF不支持大數據Bulk插入。
Dapper:輕量級ORM的代表
優點:
1.開源,輕巧,單文件,上手容易
2.支持主流的關系型數據庫,如SQLserver,MySql,Oracle等。
3.執行的效率高,Dapper的速度和原生的IDateReader接近,取列表的數據甚至超過了DateTable。Dapper的原理通過Emit反射IDataReader的序列隊列來凱蘇得到和產生對象。
缺點:
1.半自動的ORM,需要開發人員自己寫實體
2.開發的世界成本高,較弱的LINQ支持
3.維護成本高,不支持code FIrst.開發人員除了維護好數據庫中的表,還得維護好代碼中表的映射對象。
EF和Dapper結合使用:
1、Dapper是半自動的ORM,需要開發人員自己寫實體,但是和EF結合后實體部分可以由EF來完成。
2、Dapper開發成本高,叫若的linq支持,但是EF和linq結合的非常好,且不用寫sql,有效提高開發效率。
3、EF對於多表聯查,一些復雜的查詢實現比較復雜和困難,而且有可能要借助其他方案來實現(比如聯合查詢從表屬性在主表實體里設為[NotMapped],查詢出來的內容從表屬性值為null,可以再寫個包含全部屬性的實體來解決這個問題,但是過程太過麻煩),
因此這個時候Dapper該上場了! ( dbcontext.Database.Connection.Query<T> ) 完美解決這個問題。
4、傳參;利用dapper 的DynamicParameters動態參數查詢,結合dapper的dbcontext.Database.Connection.Query<T> (不用string.format()).
dp.Add(key, value) ; sql里用@key 。傳參