應用程序和數據庫采用Tcp協議通訊
ORM框架有: NHibernate ,Dapper ,Mybatis 底層是 ADO.Net
好處:
1.面向對象
2.沒有sql減少學習成本,快速開發
3.編譯檢測會更有用(寫sql,字段改了,漏改sql就會異常)
3.有編譯檢測(改了數據庫字段,必須修改,否則報錯)?
4.支持延遲特性,緩存
缺陷:
1.sql是自動生成,比較僵化,不確定是否使用索引
2.需要很多反射,對時間和空間有損耗(類,屬性,特性)
3.比較復雜的查詢不合適,用SQL 或 存儲過程, 注意EF查詢的性能優化,和SQL性能優化,
大家不要排斥ORM,因為ORM只是一個工具,雖然不能幫你把所有的事兒都做的盡善盡美,但是它有自己的價值,而且它也可以直接用ado.net的
一張應用程序,ORM,ADO.Net 和數據庫的圖,還有代碼層面的
舉一個栗子啊 控制台程序+EF6.幾
namespace Ruanmou.EFDBFirst { class Program { static void Main(string[] args) { try { Console.WriteLine("歡迎來到.Net高級班VIP課程,今晚學習EntityFramework"); //context:數據庫映射,一定有個數據庫連接,一開始實例化是沒有任何數據 //查詢個數據之后會做個trace(克隆), 然后你修改任何數據,能識別到並且翻譯成sql執行;;數據不是查詢的,那么需要去指定狀態 using (advanced11EntitiesDbContext context = new advanced11EntitiesDbContext()) { context.Database.Log += c => Console.WriteLine($"sql:{c}"); User user1 = context.Users.Find(5);//即時查詢 查詢主鍵ID=5的用戶,艾瑪,太神奇了 還有這種操作 。。。 var userList = context.Users.Where(u => u.Id > 0 && u.Name.Length > 2);//延時 foreach (var item in userList) { Console.WriteLine(item.Name); } user1.Name += "test"; user1.State += 1; context.SaveChanges();//把context全部的變化更新到數據庫 User user = context.Users.FirstOrDefault(u => u.Id == 5);//針對數據庫查詢 new List<int>().FirstOrDefault(i => i > 10);//針對內存數據的linq to object User userNew = new User() { Account = "Admin", State = 0, CompanyId = 4, CompanyName = "萬達集團", CreateTime = DateTime.Now, CreatorId = 1, Email = "57265177@qq.com", LastLoginTime = null, LastModifierId = 0, LastModifyTime = DateTime.Now, Mobile = "18664876671", Name = "yoyo", Password = "12356789", UserType = 1 }; context.Users.Add(userNew); context.SaveChanges();//自增主鍵在插入成功后,會自動賦值過去 context.Users.Remove(userNew); context.SaveChanges();//本身就是一個事務 } } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); } } }
監視執行SQL,貼下圖
以后還能不能愉快的寫SQL了。。。
刪除比修改費時,還是用軟刪除好了