在Form里顯示模態Dialog 問題 如何在WinForm的一個Form裡面彈出一個模態Dialog? 背景 程式的框架是Winform,只有一個視窗MainForm。MainForm裡面是一個TabControl,每個TabPage是一個Form,每個TabPage的Form相互獨立,互不幹擾, ...
Entity FrameWork(簡稱 EF)以面向對象的方式操作資料庫給開發人員帶來了很大的便利性,但其性能問題從面世以來就一直就被廣大的 .NET 生態開發技術人員所吐槽,然而,它真的那麼不堪使用嗎?試試下麵這 6 個小技巧,瞬間極大提升 EF Core 性能:
-
AsNoTracking
在項目開發的時候,如果查詢出來的對象不會被修改、刪除等,那麼在查詢的時候,可以啟用AsNoTracking,這樣就能降低EF Core的資源占用Book[] books = ctx.Books.AsNoTracking().Take(3).ToArray(); Book b1 = books[0]; b1.Title = "abc"; EntityEntry entry1 = ctx.Entry(b1); Console.WriteLine(entry1.State);
-
通過一條SQL語句高效更新實體類
Book b1 = new Book {Id=10}; b1.Title = "yzk"; var entry1 = ctx.Entry(b1); //直接創建實體對象 entry1.Property("Title").IsModified = true; //標記 Title 欄位被修改 Console.WriteLine(entry1.DebugView.LongView); ctx.SaveChanges(); //只生成這個欄位的更新的SQL語句
-
用一條SQL語句高效刪除數據
Book b1 = new Book { Id = 28 }; ctx.Entry(b1).State = EntityState.Deleted; ctx.SaveChanges();
-
關於 Find 和 FindAsync 方法
Find 或者 FindAsync 方法(以下簡稱為Find)會先在上下文查找這個對象是否已經被跟蹤,如果對象已經被跟蹤,就直接返回被跟蹤的對象,只有在本地沒有找到這個對象時,EF Core 才去資料庫查詢,而 Single 方法則一直都是執行一次資料庫查詢。因此用 Find 方法有可能減少一次資料庫查詢,性能更好。但是如果在對象被跟蹤之後,資料庫中對應的數據已經被其他程式修改了,則 Find 方法可能會返回舊數據。 -
如何在 EF Core 中高效地刪除、更新數據?
- 使用原生 SQL,但不太符合模型驅動、分層隔離等思想
- 使用其它開源庫如 Zack.EFCore.Batch
-
全局查詢篩選器
EF Core 支持在配置實體類的時候,為實體類設置全局查詢篩選器,EF Core 會自動將全局查詢篩選器應用於涉及這個實體類型的所有 LINQ 查詢。這個功能常見的應用場景有 "軟刪除" 和 "多租戶"Fluent API配置全局查詢篩選器: builder.HasQueryFilter(b=>b.IsDeleted==false) 忽略全局查詢篩選器 ct x.Books.IgnoreQueryFilters().Where(b => b.Title.Contains("o")).ToArray();