Laden...

NHibernate Session

Erstellt von ilcsh vor 10 Jahren Letzter Beitrag vor 10 Jahren 737 Views
I
ilcsh Themenstarter:in
25 Beiträge seit 2013
vor 10 Jahren
NHibernate Session

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

3.511 Beiträge seit 2005
vor 10 Jahren

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)

I
ilcsh Themenstarter:in
25 Beiträge seit 2013
vor 10 Jahren

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

106 Beiträge seit 2011
vor 10 Jahren

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.

I
ilcsh Themenstarter:in
25 Beiträge seit 2013
vor 10 Jahren

Hi Rabban,

das ist ein Tippfehler, da ich nicht die Originalen Namen genommen habe, aber danke für die Info.

Grüße

I
ilcsh Themenstarter:in
25 Beiträge seit 2013
vor 10 Jahren

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