Laden...

nHibernate Create Database, Create Table

Letzter Beitrag vor 16 Jahren 10 Posts 3.632 Views
nHibernate Create Database, Create Table

verwendetes Datenbanksystem: MySQL 5.0 mit nHIbernate 1.2.1.4000

Hey leute,

ich bin derzeitig dabei eine ASP.NET Anwendung zu schreiben und die Datenbankanbindung über nHIbernate zu relisieren so dass die Anwendung Datenbankunabhängig ist.

Nun kann ich aber leider nicht immer davon ausgehen das alle meine Datenbanken und Datenbankrelationen vorhanden sind und wollte daher überprüfen ob die benötigten Bereiche in meinem DBMS vorhanden sind!

Dazu habe ich leider nichts im Netz und auch nichts direkt auf nhibernate.org gefunden. Nun die Frage ob es überhaupt möglich ist dies via nHIbernate respektive nHIbernate HQL zu überprüfen und dann die Datenbanken- und relationen anzulegen.

SQL oder native SQL kann ich ja dabei theoretisch verwenden mache mich aber dann ja wieder von dem SQL Dialekt des DBMS abhängig was mir ja den Vorteil von nHibernate zu nichte macht.

Hoffe einer von euch hat da einen Ansatz oder kann mir direkt sagen ob dies möglich ist.

Gruß
Maurice

Die drei Tugenden eines Programmierers:
Faulheit, Ungeduld und Hochmut!

Hallo!

Ich selber arbeite schon eine Weile mit NHibernate, kann aber nicht sagen, dass es mir begegnet ist, dass ich Datenbanken oder Tabellen anlegen musste. Es ist generell überlegenswert, ob ein derartiges Design, dass Dein Programm eine Datenbank oder Tabelle anlegen kann, so sinnvoll ist, wenn es eigentlich für andere Aufgaben vorgesehen ist. Das erfordert eventuell stets mehr Rechte, als das Programm selber bräuchte. Ich persönlich würde das Programm seine eigentliche Aufgabe machen lassen und nur am Anfang zur Not überprüfen, ob eine Datenbank über entsprechende Einträge verfügt. Erwägenswert wäre an dieser Stelle eine Installation, die die Datenbank überprüft, entsprechend ein SQL Skript ausführt und anschließend Dein Programm installiert und auf die entsprechende DB konfiguriert.

Gruß, DaMoe

Hmm jo die Lösung habe ich auch schon in Betracht gezogen nur bin ich ja dann eben wieder abhängig von dem SQL-Dialekt den das DBMS versteht/verwendet. Und durch nHibernate bin ja als Vorteil davon unabhängig und kann zu jeder Zeit die Datenbank ohne Probleme austauschen!

gruß
maurice

Die drei Tugenden eines Programmierers:
Faulheit, Ungeduld und Hochmut!

http://forum.hibernate.org/viewtopic.php?t=970803&highlight=&sid=

man kann zwar keine Strukturupdates bei Versionsänderungen machen, aber die Erstellung des kompletten Datenbankschemas über NHibernate wäre möglich.

Wenn ich das richtig gelesen habe brauche ich dann dafür die *.hbm Dateien. Da ich aber alles über Annotations bzw. Mapping.Attributes in den Klassen- und Methodendeklarationen mache wäre das ja leider keine alternative für mich.

Oder hab ich da etwas übersehen?

gruß
Maurice

Die drei Tugenden eines Programmierers:
Faulheit, Ungeduld und Hochmut!

du musst ja an irgendeinem Punkt die NHibernate-Konfiguration erstellen. Und die enthält, ob per Mappingressource oder per Code erstellt, ab irgendeinem Punkt im Code das gemappte Schema. Und ab diesem Moment sollte SchemaExport funktionieren. Ich würds einfach mal testen.

Warum machst du das eigentlich im Code? Du kannst die Mappingdateien doch auch als eingebettete Ressource in einer Assembly hinterlegen und die dann für die NHibernate-Konfiguration benutzen. Um noch flexibler zu sein, könntest du die Mappingdateien auch mit ausliefern, so ist auch im ausgelieferten System noch eine Änderung von Tabellen- und Feldnamen möglich (das betrifft ja nur die DB-Seite, dein Code bleibt davon ja unberührt), was die Flexibilität bei Wartungs- und Migrationsarbeiten erhöht.

Edit: hab betreffend der Konfiguration was falsch verstanden. Ich wusste gar nicht, daß NHibernate eine Konfiguration per Annotation unterstützt.

Habe es nun mal mit der Methode probiert und bekomme leider die folgende Fehlermeldung:

Incorrect column specifier for column 'name'

Kann mir da nur gerade nicht wirklich etwas darunter vorstellen nur die Vermutung anstellen das es sich auf folgende Zeilen in dem Code bezieht:


[Property(Name="Datetime",Type="DateTime",Column="datetime")]
public virtual DateTime Datetime
{
       get { return m_datetime; }
set
{
	m_datetime = value;
}
}

Denn etwas anderes als diese Klasse sollte bei der aktuellen Konfiguration nicht geladen werden und dort gibt es kein Feld namens "name"/"Name".

Grr irgendwie komm ich da net wirklich weiter, aber irgendwie scheine ich ja auf dem richtigen Weg zu sein wenn er schonmal versucht etwas anzulegen.

Hier noch der Code bei dem ich versuche die Datenbank und deren Felder anzulegen:


SchemaExport export = new SchemaExport( cfg );
export.Execute( false, true, false, true );

Habe in etwa das gleich auch noch mit der Methode SchemaExport.Create(bool, bool) ausprobiert mit der gleichen Fehlermeldung.

gruß
Maurice

[EDIT]: In der SchemaExport Klasseninstanz sind auch die SQL-Strings richtig aufgelistet, hab gesehen das er versucht mehr anzulegen jedoch ist das SQL richtig geschrieben von nHIbernate und sollte daher funktionieren.

Die drei Tugenden eines Programmierers:
Faulheit, Ungeduld und Hochmut!

Böse. "datetime" ist ein Datentyp, so sollte man niemals eine Spalte nennen. Das dürfte auf so einigen Datenbanksystemen zu Fehlern führen.

Hallo,

unabhängig davon, was in diesem Thread bereits geschrieben wurde. Ich glaube Du hast mich ein wenig falsch verstanden bzw. habe mich vielleicht zu ungenau ausgedrückt:

Hmm jo die Lösung habe ich auch schon in Betracht gezogen nur bin ich ja dann eben wieder abhängig von dem SQL-Dialekt den das DBMS versteht/verwendet. Und durch nHibernate bin ja als Vorteil davon unabhängig und kann zu jeder Zeit die Datenbank ohne Probleme austauschen!

Ich meinte, dass Dein Programm den Check an sich über NHibernate durchführen kann, d.h. es soll keine bestimmte Query Language in Deinem Programm verwendet werden. Ein spezifisches QueryLanguage Skript, falls man nicht möchte, dass das eigentliche Programm das Datenbank Schema erstellt, ist dann unumgänglich. Dein Program bleibt dann weiterhin DB unabhängig, weil es NHibernate verwendet, nur das entsprechende Skript muss neu erstellt werden. Die Erstellung eines Skripts is ja nicht so umständlich.

Gruß, DaMoe

Wenn man NHibernate mit Attributen Einsetzen will, sollte man eher zu ActiveRecord greifen.

Und da ist diese Funktion simple : ActiveRecordStarter.CreateSchema();