Tôi đã cố gắng giảm tổng thời gian bắt đầu theo EF 3 lần bằng những thủ thuật đó:
-
Cập nhật khuôn khổ lên 6.2 và bật bộ nhớ đệm mô hình :
public class CachingContextConfiguration:DbConfiguration {public CachingContextConfiguration () {SetModelStore (new DefaultDbModelStore (Directory.GetCurrentDirectory ()));}
}
-
Gọi
ctx.Database.Initialize()
rõ ràng từ chủ đề mới, càng sớm càng tốt. Quá trình này vẫn mất 3-4 giây, nhưng vì nó xảy ra cùng với những thứ khác nên sẽ giúp ích rất nhiều. -
Tải các thực thể vào bộ nhớ cache EF theo thứ tự hợp lý.
Trước đây, tôi chỉ viết Bao gồm sau Inlude, dịch thành nhiều phép nối. Tôi đã tìm thấy một "quy tắc ngón tay cái" trên một số bài đăng trên blog, rằng tối đa hai chuỗi bao gồm EF hoạt động khá tốt, nhưng mỗi cái lại làm chậm mọi thứ một cách ồ ạt. Tôi cũng tìm thấy một bài đăng trên blog , điều đó cho thấy bộ đệm EF:một khi thực thể nhất định được tải với Bao gồm hoặc Tải, nó sẽ tự động được đưa vào thuộc tính thích hợp (tác giả blog đã sai về liên kết các đối tượng). Vì vậy, tôi đã làm điều này:
using (var db = new MyContext())
{
db.Fields.Load();
db.Categories.Include(c => c.MainField).Include(x => x.Fields).Load();
db.FieldValues.Load();
return db.Objects.Include(x => x.MainFieldValue.Field).ToArray();
}
Điều này đang tìm nạp dữ liệu nhanh hơn 6 lần so với bao gồm từ câu hỏi. Tôi nghĩ rằng khi các thực thể đã được tải trước đó, công cụ EF không gọi cơ sở dữ liệu cho các đối tượng liên quan, nó chỉ lấy chúng từ bộ nhớ cache.
-
Tôi cũng đã thêm điều này vào hàm tạo ngữ cảnh của mình:
Configuration.LazyLoadingEnabled = false; Configuration.ProxyCreationEnabled = false;
Ảnh hưởng của điều đó hầu như không đáng chú ý, nhưng có thể đóng vai trò lớn hơn đối với tập dữ liệu khổng lồ.
Tôi cũng đã xem cái này bài trình bày về EF Core của Rowan Miller và tôi sẽ chuyển sang sử dụng nó vào bản phát hành tiếp theo - trong một số trường hợp, nó nhanh hơn gấp 5-6 lần so với EF6.
Hy vọng điều này sẽ giúp ai đó