2009-04-20 31 views
6

Tôi mất một thời gian dài nhưng cuối cùng tôi đã nhận được Hello World của nHibernate để làm việc. Nó hoạt động sau khi tôi đã "tải chậm". Thành thật mà nói, tôi không thể nói cho bạn biết tại sao tất cả đều hiệu quả, nhưng nó đã làm và bây giờ tôi đang đọc bạn không cần tải chậm. Có một thế giới hello mà bất cứ ai có đó là xương trần làm nHibernate làm việc? Bạn có phải tải không? Tôi hỏi vì tôi muốn sử dụng nHibernate nhưng tôi cần phải hiểu cách mọi thứ đang hoạt động.Có phải tải Lazy được yêu cầu cho nHibernate không?

Cảm ơn bạn.

Bạn có biết thế giới hello không có quá nhiều chi phí không?

Sử dụng tải lười có tốt hơn không?

EDIT: Tôi đang sử dụng asp.net 3.5. Dự án ứng dụng web.

+0

Một phần khác được thêm vào trong câu trả lời của tôi. –

Trả lời

22

Tôi không hiểu những gì bạn có ý nghĩa với "Tôi đã tải lười biếng". Tải chậm là một tính năng, tính năng này được bật theo mặc định và bạn có thể tắt tính năng này nếu không thích.

Có hai loại tải chậm: để tham chiếu đến các thực thể khác và cho danh sách.

Với tổ chức này:

class Entity 
{ 
    // pk 
    int id { get; private set; } 

    // reference to another entity 
    User MyUser { get; set; } 

    // list to other entities 
    IList<Comments> MyComments { get; set; } 
} 

Lazy tải trên tham chiếu đến tài

Nếu bạn có lười tải trên tài khoản, bạn cần phải xác định tất cả các thành viên của lớp tài khoản ảo. NHibernate sẽ tạo ra một proxy được gọi là. Proxy là một lớp được định nghĩa trong thời gian chạy có nguồn gốc từ Người dùng. Mã của bạn đang truy cập nó dưới dạng Người dùng và không biết rằng đó là một lớp con. Nhưng khi bạn truy cập một trong những thành viên của nó lần đầu tiên, các thuộc tính được nạp từ cơ sở dữ liệu.

Nếu bạn muốn tắt tải lười biếng trên lớp dùng, bạn cần phải làm điều này trong bản đồ của nó:

<class name="User" lazy="false"> ... 

Sau đó NHibernate luôn tạo ra thể hiện của loại tài khoản, không có proxy. Bạn không cần phải có bất cứ điều gì ảo.

Lazy tải thuộc danh mục bình luận

Nếu bạn sử dụng tải lười biếng thuộc danh mục bình luận, nó là danh sách riêng của mình mà thực hiện việc bốc lười biếng. Nếu bạn truy cập vào danh sách lần đầu tiên, nó sẽ được tải từ cơ sở dữ liệu. NHibernate sử dụng một danh sách thực hiện IList, nhưng không phải là List.

Nếu bạn muốn tắt tải lười biếng trong danh sách, bạn làm điều này trong các bản đồ của Entity:

<class name="Entity"> 
    <bag name="MyComments" lazy="false" > 
     ... 

Thông thường, lười tải là một điều tốt, và bạn áp dụng không nhất thiết phải quan tâm đến nó nhiều. Nhưng có một số rủi ro. Ví dụ, nếu bạn tuần tự hóa một cá thể, và nó là một proxy, bạn sẽ nhận được một proxy không được khởi tạo thay vì bất cứ điều gì hữu ích. Tải xuống chỉ hoạt động miễn là phiên được mở. Nó không phải luôn luôn nhanh hơn để sử dụng tải lười biếng. Tuy nhiên, nếu bạn cần tải tất cả dữ liệu, tải xuống nhanh hơn một đoạn.

Vì vậy, cấu hình cần được thực hiện cẩn thận.


Edit:

Để trả lời câu hỏi ban đầu của bạn: Sản lười tải cần thiết cho NHibernate? Không. Nhưng: Có phải tải chậm trong ứng dụng của tôi không? Có lẽ là có.

Tôi nghĩ rằng, chỉ những ứng dụng nhỏ và nhỏ hơn không cần tải chậm. Nếu bạn có một hệ thống với nhiều lớp liên tục, bạn sẽ cần tải chậm.

+0

Tài liệu tham khảo NH hoàn toàn mâu thuẫn với chính nó với '" Vì khởi tạo lười có thể dẫn đến lỗi [...], không lười biếng là mặc định. "Và" NHibernate sử dụng tìm nạp lười cho các bộ sưu tập và tìm nạp proxy lười cho đơn hiệp hội có giá trị.' "- cho bộ sưu tập –

+0

@Chris: Câu đầu tiên là cũ. Lazy là mặc định kể từ phiên bản (i-dont-know). Câu thứ hai là những gì tôi thực sự cố gắng giải thích. –

7

Nếu bạn đang sử dụng các tệp hbm.xml để ánh xạ, chỉ cần thêm lazy="false" vào phần tử <class> sẽ giúp bạn tải không tải xuống cho tất cả các thuộc tính đơn giản. Các thực thể nước ngoài sẽ vẫn lười biếng theo mặc định. Để làm cho họ háo hức thêm lazy="false" vào phần tử ánh xạ. Một lợi ích của tải háo hức là bạn sẽ không còn cần các thuộc tính ảo trên các lớp thực thể của bạn nữa.

Chỉnh sửa: Nếu bạn thực sự muốn tìm hiểu điều gì đang diễn ra đằng sau hậu trường, NHibernate ghi lại mọi thứ bằng cách sử dụng log4net. Thêm

<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    <!-- Rest of config sections here --> 
</configSections> 
<log4net> 
    <appender name="SQLFileAppender" type="log4net.Appender.RollingFileAppender, log4net"> 
    <param name="File" value="C:\Logs\SQL.log" /> 
    <param name="AppendToFile" value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline" /> 
    </layout> 
    </appender> 
    <logger name="NHibernate.SQL" additivity="false"> 
    <level value="DEBUG" /> 
    <appender-ref ref="SQLFileAppender" /> 
    </logger> 
</log4net> 

bên <configuration> trong web.config của bạn sẽ nhổ tất cả các SQL NHibernate tạo ra các tập tin c:\logs\sql.log

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