verwendetes Datenbanksystem: MSSQL2008
Hi,
ich habe seit kurzen auf NHIBERNATE umgestellt. Habe jedoch bei einer Tabelle besondere Probleme in dem nichts zurück kommt.
Hiereinmal das Mapping der besagten Tabelle:
public class ContentAttachmentMap : ClassMapping<ContentAttachment> {
public ContentAttachmentMap() {
Table(CMS.CORE.Config.DB.Prefix.Replace("dbo.", "") +"Content_Attachment");
Schema("dbo");
Lazy(true);
//Property(x => x.Pkid, map => map.NotNullable(true));
Id<Guid>(x => x.Pkid, map => map.Generator(Generators.Guid));
Property(x => x.Nid, map => map.NotNullable(true));
Property(x => x.AttachmentType, map => { map.Column("attachment_type"); map.NotNullable(true); });
Property(x => x.ContentType, map => { map.Column("content_type"); map.NotNullable(true); });
Property(x => x.FPath);
Property(x => x.FName);
Property(x => x.ThumpNail);
Property(x => x.AttachmentArgument);
Property(x => x.ATitle);
}
}
Die Entity class:
public class ContentAttachment {
public virtual System.Guid Pkid { get; set; }
public virtual int Nid { get; set; }
public virtual string AttachmentType { get; set; }
public virtual string ContentType { get; set; }
public virtual string FPath { get; set; }
public virtual string FName { get; set; }
public virtual string ThumpNail { get; set; }
public virtual string AttachmentArgument { get; set; }
public virtual string ATitle { get; set; }
}
Ich rufe um anhand der Pkid das Attachment zu kriegen folgende Funktion auf:
public ContentAttachment GetByPKid(Guid pkid)
{
using (ISession session = NHibernateHelper.OpenSession())
{
return session.QueryOver<ContentAttachment>().Where(e => e.Pkid == pkid).Take(1).SingleOrDefault();
}
}
Ich lass aufm SQL Server den Profiler mitlaufen um besser die SQL Queires von nHiernate zu debuggen, jedoch kommt nicht mal ein SQL beim Server an, nhibernate spuckt jedoch auch keinerlei Fehler aus.
Woran könnte das liegen? Ich steht da grad etwas aufm Schlauch.
Es geht die komplette Entity nicht, also selbst wenn ich mir die ersten 100 Zeilen ausgeben lassen möchte kommt nichts zurück.
Take(1) und darauf ein SingleOrDefault() lässt darauf schließen, dass Du nicht weißt, was es tut.
Lass das Take(1) weg - unabhängig obs daran liegt oder nicht.
Dass Du innerhalb eines Abfrage (GetByPKid) eine Session extra eröffnest zeigt, dass Du keine Ahnung hast, wie man mit DB Connections umgeht.
Siehe Dir dazu den Repository Pattern (der oft zusammen mit dem UnitOfWork-Pattern erklärt wird) an. Hilfreich dazu ist auch [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Das Problem an sich ist, dass du die Entity als Lazy markiert hast. Du bekommst von HN in dem Moment nur ein Proxy zurück. Erst bei der Verwendung wird die Entity wirklich abgerufen. Das dürfte bei dir dann aber recht fix knallen, da die zugehörige Session bereits geschlossen ist.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)