2012-04-12 15 views
0

Ich versuche, Daten aus der Datenbank über Nhibernate CreateSQLQuery auf einer gespeicherten Prozedur abrufen. So etwas wie der folgende Code.NHibernate CreateSQLQuery behandelt Entitäten aktualisiert

dann bin ich im Grunde eine Sitzung Transaktion Commit, aber die Festschreibung wirft eine "kann nicht aktualisiert" Ausnahme. Es versucht, eine Update-Anweisung für CustomEntityDao auszuführen.

 const string selectSQL = "EXEC GetDataSP @Id = :Id"; 
     var query = Session.CreateSQLQuery(selectSQL); 
     query.SetString("Id", "10"); 
     query.AddEntity(typeof (CustomEntityDao)); 

     var entityList = query.List<CustomEntityDao>(); 

     try 
     { 
      Session.Transaction.Commit(); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 

Meine Frage ist, warum die Entitäten als modifizierte behandelt worden, wie Sie im Code sehen kann ich eine Abfrage nur tue.

+0

Sie sollten die Zuordnung und Entität in Frage stellen - oft ist dies ein Zeichen für eine Zuordnung nicht übereinstimmen. – AlexCuse

Antwort

2

Möglicherweise gibt es noch etwas anderes auf Ihrem Code, was ich vorschlagen kann, verwenden Sie NHibernate Profiler eine Testversion, die von www.nhprof.com heruntergeladen werden kann und überwachen die SQL-Befehle, die abgefeuert werden und beachten Sie welche Objekte werden abgerufen.

Auch ich verstehe nicht, warum Sie die Transaktion an erster Stelle begehen.

Um dieses spezielle Problem zu lösen, können Sie immer NHibernates StatelessSession verwenden, das keine Entitäten verfolgt, oder Sie können auch Session.Evict verwenden und Nhibernate bitten, die Verfolgung bestimmter Objekte zu stoppen.

+0

Dies ist nur ein Beispielcode, bei dem der echte Code grundsätzlich ein UnitOfWork-Muster auf der HTTP-Anforderungsebene verwendet. Die Transaktion wurde am Anfang der Anfrage gestartet und am Ende der HTTP-Anfrage festgelegt. Ich setze den Code inline, weil es leichter zu verstehen ist. Im Wesentlichen macht es das Gleiche. – Eatdoku

+0

Ich verwende Sessino.Evict auf den abgerufenen Objekten, um das Problem, das ich habe, zu umgehen, aber ich würde gerne verstehen, was genau vor sich geht. – Eatdoku

+0

Ich rate irgendwo in Ihrer Einheit Sie modifizieren abgerufene Entitäten und das ist, was versucht wird, gespeichert zu werden .. gehen Sie durch Ihren gesamten Fluss und sehen Sie, was geändert wird – Baz1nga

Verwandte Themen