2012-07-18 19 views
8

Tôi có ~ 300 DbSets trong ngữ cảnh của tôi và truy vấn đầu tiên sau khi tải ứng dụng (một FirstOrDefault() trong đó trên một trường được lập chỉ mục) mất ~ 40 giây.Tại sao mã EF của tôi Các lượt xem trước được tạo trước không có hiệu lực?

Để cải thiện điều này, tôi đang cố gắng sử dụng quan điểm pregenerated tại EF 4.3.1 Mã đầu tiên sử dụng các mẫu T4 ở đây:

http://blog.3d-logic.com/2012/06/13/entity-framework-codefirst-view-generation-templates-on-visual-studio-code-gallery/

tôi biên dịch nó vào, nhưng tôi thấy không có sự khác biệt hiệu suất. Tôi đã hy vọng/giả sử nó sẽ giúp khởi động chậm đau đớn tôi đang gặp, nhưng không may mắn.

Điều đó có hữu ích không? Nếu không, chính xác những gì được xem trước được sử dụng cho? Và, có điều gì tôi có thể làm để cải thiện thời gian khởi động không? Phân chia bối cảnh của tôi lên là rất khó để nói rằng ít nhất.

+0

Có điều gì đó kỳ lạ với chế độ xem được biên dịch trước trong ASP.NET. Tôi đã có cùng một vấn đề. – jrummell

Trả lời

5

Nó chỉ ra rằng nó thực sự có vẻ để tìm kiếm các quan điểm pregenerated trong hội đồng nơi thực thể tham chiếu đầu tiên là, không phải trong hội đồng nơi DbContext là. Xem thêm thảo luận tại đây: http://blog.3d-logic.com/2012/06/13/entity-framework-codefirst-view-generation-templates-on-visual-studio-code-gallery/#comment-76.

Để giải quyết vấn đề này, tôi đã tạo ra một thực thể mới và đặt nó vào trong hội đồng của bối cảnh, và liệt kê nó là DbSet đầu tiên. Bây giờ nó nhặt nó lên, và hoạt động tốt (ngoại trừ điều này là vô lý).

+2

Hành vi này tồn tại với Cơ sở dữ liệu và Mô hình đầu tiên. Các khung nhìn được tạo trước của tôi được biên dịch với ngữ cảnh trong cùng một assembly. Họ được chọn trong một giao diện điều khiển hoặc cửa sổ ứng dụng dịch vụ, nhưng không phải dưới IIS. Tôi có thể nhìn thấy nó bởi vì tôi đang sử dụng một T4 để tạo ra chúng, và đã thêm nhật ký. –

+1

có cùng một vấn đề nhưng tôi không hiểu giải pháp. Tôi có một asseblby với các thực thể POCO của tôi và một hội đồng khác với edmx của tôi. Tôi cần phải créate một thực thể trong hội đồng của tôi có edmx? Làm thế nào tôi liệt kê nó như là DBContext đầu tiên? Cảm ơn. –

5

Một số ORM nhất định như NHibernate và EF chỉ đơn giản là khởi động chậm. Thay vì cố gắng "khắc phục" sự chậm chạp này, tôi muốn loại bỏ vấn đề bằng cách đảm bảo rằng IIS kích hoạt mã này bất cứ khi nào nhóm ứng dụng khởi động. Để khắc phục sự cố này, bạn phải định cấu hình IIS để tự động khởi động nhóm ứng dụng của mình. Giải pháp này chỉ có sẵn cho .NET 4 và IIS7.5 và mới hơn.

Bạn muốn triển khai lớp học với IProcessHostPreloadClient tải ObjectContext và định cấu hình ứng dụng của bạn để sử dụng nó bằng cách thêm nút serviceAutoStartProviders vào web.config và thiết lập startMode = "AlwaysRunning" cho nhóm ứng dụng ứng dụng của bạn.

Vui lòng tham khảo Scott Gu's blog để biết chi tiết.

+0

Đó là một giải pháp tốt, nhưng tôi, vì lý do đau đớn ngoài tầm kiểm soát của tôi, bị kẹt trên IIS6/32 bit Window Server 2003, vì vậy tôi không có cách nào để sử dụng IProcessHostPreloadClient và trang web tái chế từ ngoài bộ nhớ vào buổi trưa mọi lúc ... –

+0

Tái chế thường xuyên không phải là một vấn đề. Cách tiếp cận này chỉ đơn giản là đảm bảo rằng nhóm ứng dụng khởi động lại, trong khi hành vi bình thường là nó không bắt đầu cho đến khi một cuộc gọi đến. IIS6 sẽ là một dealbreaker tuy nhiên. Là selfhosting trong một cửa sổ dịch vụ một lựa chọn? – Mithon

+0

Đó là vấn đề - người dùng đang sử dụng trang web, một lần tái chế được kích hoạt, yêu cầu tiếp theo của anh ấy chuyển đến hồ bơi ứng dụng mới và sẽ mất vĩnh viễn, khiến trang web bị treo. –

Các vấn đề liên quan