Frage

So Neuling NHibernate Benutzer; versucht, mein Gehirn herum zu wickeln.

Ich bin Betrachtung, wie Einsatz zu handhaben, und die spätere Einspritzung von Add-ons zu einem Web-App (die ihre eigene Ausdauer Klassen erfordern).

Ich dachte, dass für den Einsatz mit SchemaExport wäre ziemlich gut funktionieren, aber ich frage mich, ob es auch ein Weg NHibernate mir zu sagen, in einer gemeinsamen, codebasierte Art und Weise, dass ein Schema Export bereits geschehen ist oder nicht . Grundsätzlich mag ich smething wie in diesem Pseudo-Code tun:

  if(!_cfg.HasSchemaForType(typeof(MyType))
       ExportSchema(typeof(MyType));
  else
       UpdateSchema(typeof(MyType));

, wo die beiden Funktionen intern verwenden würden SchemaExport oder SchemaUpdate sind.


EDIT: Jungs, ich schätze die Antwort so weit, aber sie verfehlen den Punkt ein wenig. Was ich versuche bis zu setzen ist eine Möglichkeit für die Anwendung für das Hinzufügen und Entfernen von Add-ons zu ermöglichen, die Änderungen an die db erfordern. Ich spreche nicht über die Versionierung meinen eigenen Code oder dergleichen (zumindest nicht als seine primäre Funktion). Die Frage ist also weniger darum, wenn ich die App bereitstellen und mehr über, wenn ich hinzufügen oder einen Plug-in entfernen. Hat Theis-Plugin (daher die Pseudo-Code Typprüfung), bevor zum Einsatz? Wenn ja, führen Sie das Update. Wenn nicht, führen Sie den Export. Sinn machen?

War es hilfreich?

Lösung

Nein, NHibernate nicht tun, was Sie fragen. Ich stelle mir vor, es wäre möglich, einen Code zu schreiben, die das Schema exportiert und verglichen sie dann an das Datenbankschema. Aber es wäre wahrscheinlich einfacher sein, in eine temporäre Datenbank zu exportieren und ein 3rd-Party-Tool verwenden, wie redgate SQL vergleichen, um das Schema zu vergleichen.

Auch wenn es das täte, was Sie fragen, ich sehe nicht, wie das mit Einsatz helfen würde, weil ihr Zweck eine Datenbank von Grund auf neu zu erstellen ist.

Edited hinzufügen: Unter der Annahme, jedes Plugin hat seinen eigenen Satz von Tabellen, können Sie bestimmen, ob das Schema einer von mehreren Verfahren bereitgestellt wurde mit:

  • Versuchen Sie eine der Plugin-Objekte zu laden und die Ausnahme abfangen.
  • überprüfen Sie das Datenbankschema (unter Verwendung von SMO für SQL Server) zu überprüfen, ob die Tabelle (n) vorhanden ist.
  • Erstellen Sie einen Datensatz in einer Tabelle, wenn ein Plugin bereitgestellt wird.

Andere Tipps

Ich denke, dass das, was Sie suchen, SchemaUpdate.Execute ist anstelle SchemaExport zu verwenden. SchemaUpdate wird das Schema erstellen, wenn es nicht bereits vorhanden ist, oder es aktualisieren, falls erforderlich und gewünscht wird.

Das ist für mich funktioniert sowohl mit MSSQL und SQLite.

new SchemaUpdate(config).Execute(false, true);

Ja, es ist, in 3,0 mindestens

public static bool ValidateSchema()
{
    NHibernate.Tool.hbm2ddl.SchemaValidator myvalidator = new NHibernate.Tool.hbm2ddl.SchemaValidator(m_cfg);
    try
    {
        myvalidator.Validate();
        myvalidator = null;
        return true;
    }
    catch (Exception ex)
    {
        MsgBox(ex.Message, "Schema validation error");
    }
    finally
    {
        myvalidator = null;
    }

    return false;
}

Für das Update Teil tun.

public static void UpdateSchema()
{
    NHibernate.Tool.hbm2ddl.SchemaUpdate schema = new NHibernate.Tool.hbm2ddl.SchemaUpdate(m_cfg);
    schema.Execute(false, true);
    schema = null;
} // UpdateSchema

Der Zweck Schema Export ist die komplette Schema von Grund auf neu zu generieren. Wirklich nützlich, wenn Sie Ihre Anwendung noch nicht bereitgestellt haben.

Nach dem ersten Einsatz würde ich empfehlen ein Migrationen Werkzeug, das Ihnen weitere Erweiterungen / Änderungen des Schemas helfen. Wenn Sie ein bisschen mehr vorausdenken, werden Sie feststellen, dass Sie auch die Datenmanipulation erfordern (z falsche Daten zu entfernen, die auf einen Fehler aufgrund generiert wurden), wie Ihre Anwendung entwickelt. Das ist alles ein Migrations-Tool können Sie helfen mit.

Werfen Sie einen Blick in:

Hier ist eine Liste von mehr Migrations-Tool für .net in einer SO Frage beantwortet:

Die ursprüngliche Idee von Migrationen entstand aus Ruby on Rails und „geklont“ in einem anderen Rahmen über die Vergangenheit ist. Deshalb ist es auf jeden Fall gut die ursprüngliche Idee bei http://guides.rubyonrails.org/migrations zu lesen. html zu.

Wenn Sie VS Team Suite oder die Datenbank Developer Edition haben, kann es synchronisieren und Änderungen verfolgen und dann einen Bereitstellungs Skript, das die richtigen Objekte für Sie erstellen. Auch RedGate hat ein Schema Compare-Produkt, das die gleiche Sache tut, wenn ich nicht irre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top