Ինչպե՞ս կարող եմ դիտել SQL-ը, որը ստեղծվում է nHibernate-ի կողմից: տարբերակ 1.2
Ինչպե՞ս կարող եմ դիտել SQL-ը, որը ստեղծվում է nHibernate-ի կողմից:
Պատասխանները:
Դուք կարող եք նման բան տեղադրել ձեր app.config/web.config ֆայլում.
configSections հանգույցում.
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
կազմաձևման հանգույցում.
<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>
Եվ մի մոռացեք զանգահարել
log4net.Config.XmlConfigurator.Configure();
ձեր դիմումի սկզբում կամ դնելու համար
[assembly: log4net.Config.XmlConfigurator(Watch=true)]
assemblyinfo.cs-ում
Կազմաձևման կարգավորումներում սահմանեք «show_sql» հատկությունը true:
Կազմաձևման կարգավորումներում սահմանեք «show_sql» հատկությունը true: Սա կհանգեցնի SQL-ի թողարկմանը NHibernate-ի logfiles-ում log4net-ի կողմից:
Ես մի քիչ ուշացել եմ, գիտեմ, բայց սա հնար է անում, և դա գործիք/db/framework անկախ է: Այդ վավեր տարբերակների փոխարեն ես օգտագործում եմ NH Interceptors:
Սկզբում ներդրեք դաս, որը ընդլայնում է NHibernate.EmptyInterceptor և իրականացնում 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);
}
}
}
Այնուհետև, պարզապես անցեք մի օրինակ, երբ բացում եք ձեր նիստը: Համոզվեք, որ դա արեք միայն DEBUG-ում.
public static void OpenSession() {
#if DEBUG
HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession(new SQLDebugOutput());
#else
HttpContext.Current.Items[SessionKey] = _sessionFactory.OpenSession();
#endif
}
Եվ վերջ։
Այսուհետ ձեր sql հրամանները նման են...
var totalPostsCount = Database.Session.Query<Post>().Count();
var currentPostPage = Database.Session.Query<Post>()
.OrderByDescending(c => c.CreatedAt)
.Skip((page - 1) * PostsPerPage)
.Take(PostsPerPage)
.ToList();
.. ցուցադրվում են ուղիղ ձեր ելքային պատուհանում.
NH. ընտրեք cast(count(*) որպես INT) որպես col_0_0_ հաղորդագրություններից0_
NH: Ընտրեք post0_.Id AS ID3_, post0_.user_id որպես user2
. գրառումներից post0_ պատվիրել ըստ post0_.created_at desc limit ? օֆսեթ ?var totalPostsCount = Database.Session.Query<Post>().Count(); var currentPostPage = Database.Session.Query<Post>() .OrderByDescending(c => c.CreatedAt) .Skip((page - 1) * PostsPerPage) .Take(PostsPerPage) .ToList();
sessionFactory.WithOptions().Interceptor(new SQLDebugOutput()).OpenSession()
է: Այս կերպ, եթե մենք բացի սրանից ավելի շատ ընդհատողներ ունենանք, մենք կարող ենք պարզապես շղթայել դրանք ձեր Interceptor
-ի հետևից: 29.02.2020 Օգտագործեք sql սերվերի պրոֆիլը:
ԽՄԲԱԳՐԵԼ (1 տարի անց). Ինչպես ստորև նշում է @Toran Billups-ը, NHibernate պրոֆիլի հեղինակ Այենդեն գրել է, որ շատ հիանալի է:
Կարող եք նաև փորձել NHibernate Profiler (30 օր փորձաշրջան, եթե այլ բան չկա): Այս գործիքը լավագույնն է IMHO-ի շուրջ:
Սա ոչ միայն ցույց կտա ստեղծված SQL-ը, այլ նաև նախազգուշացումներ/առաջարկություններ/և այլն
NHibernate գրանցման համար լավ հղում կա՝ Ինչպես կարգավորել Log4Net-ը NHibernate-ի հետ օգտագործելու համար: Այն ներառում է տեղեկատվություն NHibernate-ի կողմից ստեղծված SQL բոլոր հայտարարությունների գրանցման մասին:
Եթե դուք օգտագործում եք SQL Server (ոչ Express), կարող եք փորձել SQL Server Profiler-ը:
Կամ, եթե ցանկանում եք ցույց տալ կոնկրետ հարցման SQL, օգտագործեք հետևյալ մեթոդը (առաջարկվածի մի փոքր փոփոխված տարբերակը այստեղ Ռիկարդո Պերեսի):
private String NHibernateSql(IQueryable queryable)
{
var prov = queryable.Provider as DefaultQueryProvider;
var session = prov.Session as ISession;
var sessionImpl = session.GetSessionImplementation();
var factory = sessionImpl.Factory;
var nhLinqExpression = new NhLinqExpression(queryable.Expression, factory);
var translatorFactory = new NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory();
var translator = translatorFactory.CreateQueryTranslators(nhLinqExpression, null, false, sessionImpl.EnabledFilters, factory).First();
var sql = translator.SQLString;
var parameters = nhLinqExpression.ParameterValuesByName;
if ( (parameters?.Count ?? 0) > 0)
{
sql += "\r\n\r\n-- Parameters:\r\n";
foreach (var par in parameters)
{
sql += "-- " + par.Key.ToString() + " - " + par.Value.ToString() + "\r\n";
}
}
return sql;
}
և փոխանցիր դրան NHibernate
հարցում, այսինքն.
var query = from a in session.Query<MyRecord>()
where a.Id == "123456"
orderby a.Name
select a;
var sql = NHibernateSql(query);
Դուք խնդրում եք միայն դիտելու համար; բայց այս պատասխանը բացատրում է, թե ինչպես մուտքագրել այն ֆայլ: Մուտք գործելուց հետո այն կարող եք դիտել ցանկացած տեքստային խմբագրիչում:
NHibernate-ի վերջին տարբերակները աջակցում են կոդի միջոցով մուտքագրելու հնարավորություն: Ստորև բերված է օրինակելի կոդը, որը ցույց է տալիս դա: Խնդրում ենք կարդալ մեկնաբանությունները ավելի լավ հասկանալու համար:
Configuration configuration = new Configuration();
configuration.SetProperty(NHibernate.Cfg.Environment.Dialect, ......);
//Set other configuration.SetProperty as per need
configuration.SetProperty(NHibernate.Cfg.Environment.ShowSql, "true"); //Enable ShowSql
configuration.SetProperty(NHibernate.Cfg.Environment.FormatSql, "true"); //Enable FormatSql to make the log readable; optional.
configuration.AddMapping(......);
configuration.BuildMappings();
ISessionFactory sessionFactory = configuration.BuildSessionFactory();
//ISessionFactory is setup so far. Now, configure logging.
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(Assembly.GetEntryAssembly());
hierarchy.Root.RemoveAllAppenders();
FileAppender fileAppender = new FileAppender();
fileAppender.Name = "NHFileAppender";
fileAppender.File = logFilePath;
fileAppender.AppendToFile = true;
fileAppender.LockingModel = new FileAppender.MinimalLock();
fileAppender.Layout = new PatternLayout("%d{yyyy-MM-dd HH:mm:ss}:%m%n%n");
fileAppender.ActivateOptions();
Logger logger = hierarchy.GetLogger("NHibernate.SQL") as Logger;
logger.Additivity = false;
logger.Level = Level.Debug;
logger.AddAppender(fileAppender);
hierarchy.Configured = true;
Դուք կարող եք հետագայում խաղալ FileAppender
-ի և Logger
-ի հետ՝ ըստ ձեր կարիքի: Խնդրում ենք այցելել այս պատասխանը և այս ռեսուրսը լրացուցիչ մանրամասների համար: Սա բացատրում է նույնը XML կոնֆիգուրացիայի դեպքում. բայց նույնը պետք է հավասարապես վերաբերվի ծածկագրին: