2012-10-16 25 views
12

Ich verwende Fluent NHibernate für meine ORM. Dabei versuche ich, die NHibernate LINQ-Syntax zu verwenden, um eine Reihe von Daten mit der Macht von LINQ zu holen. Der Code, den ich habe, funktioniert und wird korrekt ausgeführt, mit der Ausnahme, dass ein Timeout ausgelöst wird, wenn es länger als ungefähr 30 Sekunden dauert, um ausgeführt zu werden. Die Frage, die ich habe, ist, wie verlängere ich die Standard-30-Sekunden-Timeout für LINQ-Anweisungen über NHibernate?Wie Zeitüberschreitung für NHibernate LINQ-Anweisung festlegen

ich bereits die Beiträge here, here und here aber die ersten beiden der Datacontext der Timeout-Eigenschaft auf Einstellung beziehen gesehen haben, die hier nicht gilt, und die dritte bezieht sich das Timeout in XML zu Einstellung, die auch nicht zutrifft weil ich Fluent NHibernate verwende, um das XML on the fly zu generieren. Nicht nur das, aber die Post ist 2 Jahre alt und Fluent NHibernate hat sich seitdem geändert.

Mit den ICriteria-Objekten und sogar HQL kann ich das Timeout angeben, aber das ist hier nicht das Ziel. Ich würde gerne wissen, wie man das gleiche Timeout setzt und LINQ benutzt.

Beispielcode:

using (var session = SessionFactory.OpenSession()) 
    using (var transaction = session.BeginTransaction()) 
    { 
     var query = (from mem in session.Query<Member>() 
        select mem); 
     query = query.Where({where statement}); 
     int start = (currentPage - 1) * max); 
     if (start > 0) 
      query = query.Skip(start).Take(max); 
     else 
      query = query.Take(max); 

     var list = query.ToList(); 
     transaction.Commit(); 
     return list; 
    } 

Dieser Code (wo Aussage keine Rolle spielt) eignen sich für alle Zwecke außer wenn ein Timeout auftritt.

Jede Hilfe wird geschätzt. Danke im Voraus!

+0

Überprüfen Sie die Antwort von Kingpin2k. Hat super für mich gearbeitet. –

Antwort

12

Ich habe am Ende den Befehl Timeout für die Konfiguration für Fluent NHibernate gesetzt. Der Nachteil ist, dass es das Timeout für ALLE meine Datenzugriffsaufrufe und nicht nur für das eine setzt.

Beispielcode:

.ExposeConfiguration(c => c.SetProperty("command_timeout", (TimeSpan.FromMinutes(10).TotalSeconds).ToString())) 

fand ich diesen Vorschlag von this Website.

+5

Sie sollten den NHibernate.Cfg.Environment-Namespace verwenden, wenn Sie NHibernate-Eigenschaften festlegen. Auf diese Weise werden Sie nicht den Text ersetzen, wenn sich der Schlüssel ändert. Für das Befehls-Timeout können Sie, wie Brandon vorgeschlagen hat, Folgendes tun, aber die Konstante verwenden: '.ExposeConfiguration (c => c.SetProperty (NHibernate.Cfg.Environment.CommandTimeout, TimeSpan.FromMinutes (5) .TotalSeconds.ToString()) ' –

+0

Ich habe versucht, das gleiche zu tun.Hat nicht funktioniert.Es dauert immer noch den Standardwert von 30s – Zuber

0

ich ziemlich viel Zeit damit verbracht haben nur kämpfen und hoffentlich wird dies jemand retten sonst einige Zeit.

Sie sollten den Methodenaufruf .Timeout(120) im allerletzten Moment verwenden, um sicherzustellen, dass er verwendet wird. TBH bin ich nicht 100% sicher, warum dies ist aber hier sind einige Beispiele:

ARBEITET

query = query.Where(x => x.Id = 123); 

var result = query.Timeout(120).ToList(); 

FUNKTIONIERT NICHT

query.Timeout(120); 

query = query.Where(x => x.Id = 123); 

var result = query.ToList(); 

Wenn wie in der zweiten getan (doesn‘ T WORK), scheint es, auf den Standard-System.Transaction.TransactionManager.DefaultTimeout zurückzugreifen.

+0

nach der Abfrage für uns arbeitete bei $ Arbeit – Malcolm

+0

Glücklich für jeden, der mich mit einem richtigen Test falsch zu beweisen, aber ich tat dies manuell viele Male und reproduziert es jedes Mal.Ich stimme zu, es wird nach der Abfrage funktionieren, solange Sie fügen Sie die zusätzliche Where-Klausel nicht hinzu und machen Sie dann die '.ToList();' –

+2

Ich denke, Sie müssen Variable neu zuweisen als Query = query.Timeout (120); –