Hallo,
habe gerade meine Anwendung mit NHibernate Profiler überwacht.
Dieser empfiehlt mir kein Using zu verwenden, wenn ich eine Session öffnen möchte.
Falsch (laut URL: http://hibernatingrhinos.com/products/NHProf/learn/alert/SelectNPlusOneInTheSameRequest)
Using OS As ISession = DatabaseSession.OpenSession
Wird nach dem Using die Variable OS nicht gelöscht? Ich mache noch zusätzlich das Close. Ist das jetzt falsch oder richtig?
Grüße
Hi,
natürlich kannst du using verwenden und solltest du auch. Der Link zeigt auf ein vollkommen anderes Problem, nämlich SELECT + 1.
Gruß
Khalid
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
Hi,
ok, das habe ich dann falsch verstanden. Ich verstehe trotzdem nicht was ich da ändern soll?
So schaut meine Domain/Mapping aus
//Mapping
References(x => x.Roles).Column("rID").Cascade.All();
//Domain
public virtual Roles Role { get; set; }
und diese frage ich ganz normal ab über
session.CreateCriteria<T>.List<T>();
Grüße
Hallo ilcsh,
den Select N + 1 solltest du bei einer normalen Abfrage eigentlich nicht bekommen. Wenn dann tritt er anschliessend auf, wenn du mit der Entität arbeitest.
Lies dir am besten nochmal genau die Beschreibung von Select N + 1 durch, zusammen mit dem Profiler solltest du die Stelle dann recht schnell finden.
Was der Profiler zwar nicht anmeckert, mir aber negativ auffällt ist, das die Entität "Roles" heisst und somit suggeriert das sich mehrere Rollen darin befinden,
die Property heisst aber "Role", womit du widerum suggeriest das es doch nur eine Rolle ist. Hier solltest du eindeutiger benennen.
Desweiteren nennst du den Identifier "rID" was sicherlich für RoleID stehen soll.
Dies ist überflüssig, da jede Entität immer nur einen Identifier ID hat. Bei ForeignKeys ist die Benennung dann wieder sinnig, aber auch hier würde ich dir empfehlen sprechendere Bezeichnungen zu wählen.
Hi Rabban,
das ist ein Tippfehler, da ich nicht die Originalen Namen genommen habe, aber danke für die Info.
Grüße
Hallo,
ich habe es immer noch nicht so verstanden 😕
Also, wenn ich das so mache, erhalte ich keine Fehlermeldung:
ISession os = DatabaseSession.OpenSession;
using (TR == os.BeginTransaction) {
Liste = os.CreateCriteria(typeof(T)).List<T>();
TR.Commit();
}
return Liste;
Wenn ich das OS als Using mache, erhalte ich immer die N+1 Fehlermeldung?
In Mapping wo ich die "References" gesetzt habe, habe ich ".Fetch.Join()" angegeben.
Kann mir hier jemand Helfen?
Grüße