2015-07-15 3 views
0

Я делаю довольно большую операцию в NHibernate, где я как бы синхронизую две базы данных. Это, конечно, занимает некоторое время, и было бы неплохо представить ход операции для пользователя.Прогресс по запросу NHibernate

Теперь единственное, что я могу представить, это таблица состояния по таблице. Но было бы неплохо сделать 34/2344 сделанных записей.

Возможно ли это в NHibernate (не принимая каждую строку отдельно)?

+0

Вы не должны использовать NHibernate для такого рода вещей, но вместо этого вместо SQL. Или посмотрите на [SqlBulkCopy] (http://www.4guysfromrolla.com/articles/102109-1.aspx). – BCdotWEB

+0

Ну, это очень удобно с NHibernate, так как я могу использовать свои стандартные запросы и не забудьте получить правильные данные. Также NHibernate обрабатывает различные базы данных довольно хорошо (SQL Server и SQLite) – Markus

+0

В общем, я бы сказал, нет. Возможно, что-то можно сделать с помощью прослушивателей событий NHibernate. Но вы не показали, что вы на самом деле делаете. –

ответ

0

Вы можете использовать ProgressInterceptor класс для перехвата и сообщать о прогрессе, как это:

var interceptor = new ProgressInterceptor(progress); 
var session = sessionFactory.OpenSession(interceptor); 

var query = session.Query<Entity>()... 
interceptor.StartIntercept<Entity>(0, 100, query.Count()); 
entities = query.Fetch(x => x.Chidren).ToList(); 
interceptor.StopIntercept(); 

А вот ProgressInterceptor. Если вы получите исключение StackOverflowException, добавьте блокировку в функцию отчетов о ходе выполнения.

public class ProgressInterceptor : EmptyInterceptor 
{ 
    IProgress<int> progress; 
    int   count; 
    double   start; 
    double   end; 
    double   factor; 
    string   className; 
    int?   lastReport; 

    public ProgressInterceptor(IProgress<int> progress) 
    { 
     this.progress = progress; 
    } 

    public void StartIntercept<T>(double start, double end, int steps) 
    { 
     count  = 0; 
     this.start = start; 
     this.end = end; 
     factor  = (end - start)/steps; 
     className = typeof(T).FullName; 
     lastReport = null; 
    } 

    public void StopIntercept() 
    { 
     className = null; 
    } 

    public override object Instantiate(string clazz, EntityMode entityMode, object id) 
    { 
     if (className == clazz) 
     { 
      count++; 
      var newReport = (int)Math.Min(start + count * factor, end); 
      if (newReport != lastReport) 
       progress.Report(newReport); 
      lastReport = newReport; 
     } 
     return base.Instantiate(clazz, entityMode, id); 
    } 
} 
+0

Интересно! Я попробую, а затем пометю. – Markus

Смежные вопросы