Archive for the 'NHibernate' Category

NHibernate: XML-Daten mappen

Schade, heute hätte ich es mal gebraucht: Eine Unterstützung für den XML-Datentyp von SQL Server 2005 in NHibernate oder die Möglichkeit, XML irgendwie nativ wegzuspeichern. Bekomme ich aber nicht, stattdessen nur die Fehlermeldung, dass der Mapper damit nix anfangen könne.

Ein kleiner Workaround ist mir allerdings geblieben:

  • Die Daten werden jetzt als NText gespeichert und in einer als protected gekennzeichneten Eigenschaft gehalten
  • Diese wird in NHibernate gemapped, während gleichzeitig eine als public gekennzeichnete Eigenschaft existiert, die aber nicht gemapped ist
  • Der Zugriff nach außen findet über eine Eigenschaft vom Typ XmlDocument statt, in die ich zur Laufzeit das geladene XML einlade bzw. aus der ich es mir beim Speichern hole
  • Zum Speichern wird auf [Öffentliche Eigenschaft].OuterXml zugegriffen
  • Beim Laden werden die Daten per LoadXML() ins XML-Dokument eingelesen

Der Code der Klasse sieht so aus:

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace CYTShops.Customers.Ebay
{
   ///

   /// Represents an exported item
   ///

   public class EbayExportedItem
   {

      private int _id;

      ///

      /// Id of the item
      ///

      public virtual int Id
      {
         get { return _id; }
         set { _id = value; }
      }

      private string _ebayId;

      ///

      /// Ebay-ID of the item
      ///

      public virtual string EbayId
      {
         get { return _ebayId; }
         set { _ebayId = value; }
      }

      ///

      /// Xml-Code of the itemn
      ///

      protected virtual string Xml
      {
         get { return XmlData.OuterXml; }
         set { XmlData.LoadXml(value); }
      }

      private XmlDocument _xmlNode = new XmlDocument();

      ///

      /// XmlNode for external access
      ///

      public virtual XmlDocument XmlData
      {
         get { return _xmlNode; }
         set { _xmlNode = value; }
      }

   }
}

Beim Mapping kann jetzt auf die für das Speichern nicht notwendige Eigenschaft XmlData verzichtet werden:

< ?xml version="1.0" encoding="utf-8" ?>
                   namespace=”CYTShops.Customers.Ebay”
                   assembly=”CYTShops.Customers.Ebay”>

  

     
     
        
     

     
     
           
     
           
  
  

Nicht schön, aber dafür selten.

NHibernate: Unknown entity class

Falls sich jemand wundern sollte, wieso NHibernate sich bei einer =
Klasse, die definitiv gemappt worden ist, dar=FCber =
beschwert, dass es sich um eine “unknown entity class” handele: Es =
k=F6nnte sein, dass die Mapping-Datei nicht [Klassenname].hbm.xml, =
sondern irgendwie anders hei=DFt. Am Besten [Klassenname].hmb.xml =
oder [Klassenname].hbn.xml.=20

Kann man auch gerne mal als Gag versuchen – vorzugsweise, wenn man neu =
irgendwo ist und sich schnell einen Namen als unverzichtbarer Crack =
machen m=F6chte. Oder wenn man ohnehin zuviel Zeit hat.

NHibernate: Achtet auf die Datenbankverbindung!

Ich habe jetzt vier Tage mit Fehlersuche zugebracht, weil bei der Webseite eines Kunden unter Last plötzlich keine Daten mehr kamen. Lokal konnte ich das auch mit Lasttests nicht reproduzieren, auf der Testumgebung des Kunden auch nicht – nur auf den Produktivservern passierte es. Nachdem ich irgendwan log4net am Laufen hatte, konnte ich feststellen, dass NHibernate die Datenbankverbindung verloren haben muss – jedenfalls wiesen die Exceptions darauf hin. NHibernate stellt in diesem Fall die Verbindung nicht mehr selber her – ein .Connection.Open() wirkt hier im Zweifelsfall Wunder.

Nachdem ich meine NHibernate-Hilfsklasse entsprechend modifiziert habe, scheint es jetzt zu laufen. Was für ein dämlicher Fehler!

VS 2005 und .NET 2.0 Tools

Meine Liste an Tools und Frameworks, die man unbedingt benötigt, um mit .NET 2.0 und dem VS 2005 sinnvoll arbeiten zu können (ja, ist durcheinander gewürfelt):

ReSharper
Das beste Refactoring-Plugin für C#. Ergänzt und erweitert das vorhandene Refactoring so umfassend, dass die 199,– Dollar perfekt angelegt sind. Hat aber mit einem deutschsprachigen VS 2005 Probleme (Farben), deshalb unbedingt zuvor ausprobieren!

Refactor!
Refactoring-Plugin für C#, B# und J#. Ist sehr einfach und intuitiv zu bedienen und kann die wichtigsten Sachen. Erweitert B# und J# um Refactoring-Mechanismen und ist in der einfachen Version kostenlos. Die kostenpflichtige Version kann mehr und kostet 99,– Dollar. Gut angelegtes Geld übrigens.

Visual SourceSafe 2005 Internet
Ich bin viel mobil unterwegs und benötige eine Möglichkeit, von überall an mein SourceSafe ran zu kommen. Außerdem will ich eine komplette VS 2005-Integration, sowie einfachste Bedienung und Installation. Ist übrigens auch mit Visual Studio 2003 kombinierbar.

Consolas Schriftart
Ist zwar keine Proportionalschriftart, aber liest sich in der Entwicklungsumgebung deutlich besser als das gute alte Courier New. Kostenlos.

NHibernate
Ich habe keine Lust mehr auf ADO.NET! NHibernate ist ein Persistenz- und O/R-Mapping-Framework, dass dem Entwickler das lästige Schreiben von SQL-Statements weitestgehend erspart. Es kann Beziehungen abbilden und kann mit Hilfe von Caches und eigenen Plugins noch skalierbarer und performanter gemacht werden.

SharpZipLib
Zwar bietet das .NET-Framework 2.0 eine Unterstützung für ZIP-Dateien an, aber ist die eher rudimentär und nicht besonders leistungsfähig. Besser ist hier die bewährte SharpZipLib, die einfach mehr kann und dennoch OpenSource ist.

Welche Tools und Komponenten fehlen noch?

NHibernate mit Access-Datenbank

NHibernate ist mit Hilfe seines Jet-Treibers in der Lage, gegen eine Access-Datenbank zu arbeiten. Dies ist extrem praktisch bei Miet-Webspace, der teilweise keine SQL-Server-Datenbanken unterstützt (ja, das soll es geben).

Wie üblich sind die Informationen zur Konfiguration etwas spärlich, deshalb hier ein Beispiel in Form einer externen Konfigurationsdatei:

< ?xml version='1.0' encoding='utf-8'?>

  
  

     
               NHibernate.Connection.DriverConnectionProvider
               NHibernate.JetDriver.JetDialect, NHibernate.JetDriver
               NHibernate.JetDriver.JetDriver, NHibernate.JetDriver
               Provider=Microsoft.Jet.OLEDB.4.0;Data Source=[...].mdb

  

Achtung: Beim Einsatz von NHibernate Attributes habe ich reproduzierbar Probleme beim Speichern. Entweder also nur NHibernate mit XML-Konfigurationsdateien oder so etwas wie ActiveRecord einsetzen.

NHibernate und hbm2ddl.auto

NHibernate hat ein nettes Feature: Es kann die Datenbankstrukturen anhand der gemappten Daten selbständig anlegen.

Um dieses Feature zu aktivieren, sollte NHibernate mit dem Konfigurationsparameter hbm2ddl.auto und dem Wert create initialisiert werden. Hier ein entsprechender Auszug aus meiner Konfiguration:

< ?xml version="1.0" encoding="utf-8" ?>

  
     
      NHibernate.Dialect.MsSql2000Dialect      NHibernate.Connection.DriverConnectionProvider            NHibernate.Driver.SqlClientDriver      false      true      true 1, false 0, yes ‘Y’, no ‘N’      create
  

Nachteilig dabei: Bei jeder Initialisierung wird nun das Schema neu erzeugt. Deshalb sollte nach dem Anlegen der Tabellenstruktur der Eintrag auf

      none

geändert werden. Leider wird ein Schema-Update wie bei Hibernate nicht unterstützt.

Unbedingt einen Blick wert: NHibernate 1.2

Habe mir gerade die aktuelle Beta-Version von NHibernate gezogen, und muss sagen: Respekt, alle Achtung. Läuft sehr schnell, alle Komponenten werden per default per Lazy-Loading geladen (senkt den Performance-Verbrauch) und funktioniert einwandfrei mit .NET-Generics.

Einige kurze Tipps:

  • Collections stets nur als Interfaces deklarieren (IList bzw. IList statt ArrayList oder List), da diese per Injection mit NHibernate-spezifischen Klassen befüllt werden
  • Die Mapping-Dateien am Besten als Ressourcen kompilieren (dann müssen sie nicht ständig mitkopiert werden)
  • Unbedingt die Session konfigurieren, bevor Assemblierungen geladen werden
  • Für das Lazy-Loading unbedingt alle Eigenschaften als virtual (Overridable bei VB) deklarieren

Wer noch nicht weiß, was NHibernate ist: Ein O/R-Mapping-Tool. Oder noch einfacher: Ein Tool, das dafür sorgt, dass ihr nie wieder direkt mit ADO.NET arbeiten müsst.