2008-09-24 26 views

Trả lời

39

Bạn có thể đặt một cái gì đó như thế này trong App.config/web.config tập tin của bạn:

trong configSections nút:

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> 

trong nút cấu hình:

<log4net> 
    <appender name="NHibernateFileLog" type="log4net.Appender.FileAppender"> 
    <file value="logs/nhibernate.txt" /> 
    <appendToFile value="false" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n" /> 
    </layout> 
    </appender> 
    <logger name="NHibernate.SQL" additivity="false"> 
    <level value="DEBUG"/> 
    <appender-ref ref="NHibernateFileLog"/> 
    </logger> 
</log4net> 

Và đừng quên gọi

log4net.Config.XmlConfigurator.Configure(); 

ở lần khởi động của ứng dụng của bạn, hoặc để đặt

[assembly: log4net.Config.XmlConfigurator(Watch=true)] 

trong AssemblyInfo.cs

Trong cài đặt cấu hình, thiết lập các "show_sql" bất động sản là true.

+0

Tôi tìm thấy SQL được đăng nhập ở mức DEBUG để bạn có thể muốn đảm bảo mức logger là DEBUG. – stimms

+0

chỉnh sửa xong! – mathieu

+0

Mục tiêu cuối cùng của tôi là đọc sql từ NHibernate, xem [ở đây bài đăng khác] (http://stackoverflow.com/questions/8244083/how-to-read-sql-generated-by-nhibernate-in-visual-studio) – freeflying

6

Sử dụng trình biên dịch máy chủ sql.

CHỈNH SỬA (1 năm sau): Khi @Toran Billups nêu rõ dưới đây, hồ sơ NHibernate Ayende viết rất rất hay.

+0

Nhanh hơn rất nhiều so với việc lướt qua MB tệp nhật ký. –

16

Trong cài đặt cấu hình, hãy đặt thuộc tính "show_sql" thành true. Điều này sẽ làm cho SQL được xuất ra trong nhật ký của NHibernate do log4net cung cấp.

+0

Tốt. Tôi quên mất điều đó. * nhấp * –

+0

Tại sao đây không phải là câu trả lời được chấp nhận? :) Cảm ơn vì tiền hỗ trợ. –

+0

Điều này không hiển thị đầy đủ SQL cho tôi. Tôi thấy không phải giá trị thực tế, một cái gì đó như thế này: 'SELECT application0_.ApplicationId như app === App1_101_1_, application0_.ApplicationNumberCounty như ApplicationNu2_101_1 ...' –

5

Bạn cũng có thể thử NHibernate Profiler (bản dùng thử 30 ngày nếu không có gì khác). Công cụ này là tốt nhất xung quanh IMHO.

này sẽ không chỉ hiển thị các SQL được tạo ra nhưng cũng cảnh báo/góp ý/etc

+0

Deffo - +1. Nó không tồn tại khi câu hỏi này được hỏi! –

+0

Không hoạt động với SQL CE (mặc dù nó được quảng cáo như vậy), chỉ là FYI –

1

Nếu bạn đang sử dụng SQL Server (không Express), bạn có thể thử SQL Server Profiler.

5

Tôi hơi muộn một chút, nhưng điều này thực hiện thủ thuật và nó là công cụ/db/framework độc lập. Thay vì các tùy chọn hợp lệ, tôi sử dụng NH Interceptors.

Lúc đầu, thực hiện một lớp học kéo dài NHibernate.EmptyInterceptor và thực hiện NHibernate.IInterceptor:

using NHibernate; 

namespace WebApplication2.Infrastructure 
{ 
    public class SQLDebugOutput : EmptyInterceptor, IInterceptor 
    { 
     public override NHibernate.SqlCommand.SqlString 
      OnPrepareStatement(NHibernate.SqlCommand.SqlString sql) 
     { 
      System.Diagnostics.Debug.WriteLine("NH: " + sql); 

      return base.OnPrepareStatement(sql); 
     } 
    } 
} 

Sau đó, chỉ cần vượt qua một ví dụ khi bạn mở phiên của bạn. Hãy chắc chắn chỉ làm điều đó khi ở DEBUG:

public static void OpenSession() { 

#if DEBUG 
    HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession(new SQLDebugOutput()); 

#else 
    HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession(); 

#endif 
} 

Và đó là nó.

Từ giờ trở đi, các lệnh sql của bạn như thế này ...

var totalPostsCount = Database.Session.Query<Post>().Count(); 

var currentPostPage = Database.Session.Query<Post>() 
     .OrderByDescending(c => c.CreatedAt) 
     .Skip((page - 1) * PostsPerPage) 
     .Take(PostsPerPage) 
     .ToList(); 

.. được trình bày thẳng vào cửa sổ Output của bạn:

NH: chọn diễn viên (count (*) như INT) như col_0_0_ từ bài viết post0_

NH: chọn post0_.Id như Id3_, post0_.user_id là user2_3_, post0_.Title là Tiêu đề3_, post0_.Sugug là Slug3_, post0_.Content là Content3_, post0_.created_at như created6_3_, post0_.updated_at as updated7_3_, post0_.deleted_at as deleted8_3_ from posts post0_ đặt hàng bởi post0_.created_at desc limit? bù lại ?

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