Domanda

Quindi, newbie utente NHibernate; cercando di avvolgere il mio cervello intorno ad esso.

Sto contemplando come gestire la distribuzione, e l'iniezione successiva di add-on per una web app (che può richiedere le proprie classi di persistenza).

Stavo pensando che l'utilizzo SchemaExport per il dispiegamento avrebbe funzionato abbastanza bene, ma mi chiedevo se c'è un modo troppo ottenere NHibernate a dirmi in un modo comune, basato su codice che un'esportazione dello schema è stato già fatto, o no . Fondamentalmente, io voglio fare smething come in questo pseudocodice:

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

dove le due funzioni userebbero internamente rispettivamente SchemaExport o SchemaUpdate,.


EDIT: Ragazzi, apprezzo la risposta fino ad ora, ma si perdono il punto un po '. Quello che sto cercando di creare è un modo per l'applicazione per consentire l'aggiunta e la rimozione di componenti aggiuntivi che possono richiedere modifiche al db. Non sto parlando di versioni mio codice o simili (almeno, non come la sua funzione primaria). Quindi la domanda è meno di quando schiero l'applicazione, e di più su quando aggiungere o rimuovere un plug-in. Ha plug-Theis (da qui il pseudo-codice tipo di controllo) stato schierato prima? In tal caso, eseguire l'aggiornamento. In caso contrario, eseguire l'esportazione. Dare un senso?

È stato utile?

Soluzione

No, NHibernate non fa quello che stai chiedendo. Immagino che sarebbe possibile scrivere del codice che ha esportato lo schema e poi paragonato allo schema del database. Ma probabilmente sarebbe più facile da esportare in un database temporaneo e di utilizzare uno strumento di 3a parte, come ad esempio Redgate SQL Compare, per confrontare gli schemi.

Anche se lo ha fatto quello che stai chiedendo, non vedo come che avrebbe aiutato con la distribuzione perché il suo scopo è quello di creare un database da zero.

A cura di aggiungere: Assumendo ogni plugin ha una propria serie di tabelle, è possibile determinare se lo schema è stato implementato utilizzando uno dei diversi metodi:

  • Tentativo di caricare uno degli oggetti di plugin e catturare l'eccezione.
  • Esaminare lo schema del database (utilizzando SMO per SQL Server) per verificare se la tabella (s) esiste.
  • Crea un record in una tabella quando un plugin viene distribuito.

Altri suggerimenti

Credo che quello che stai cercando è SchemaUpdate.Execute invece di utilizzare SchemaExport. SchemaUpdate creerà lo schema, se non esiste già, o aggiornare, se necessario e desiderato.

che funziona per me usando sia MSSQL e SQLite.

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

Sì, c'è, in almeno 3,0

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;
}

Per la parte di aggiornamento, fare.

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

Lo scopo di esportazione dello schema è quello di generare lo schema completo da zero. Davvero utile se non è ancora stato distribuito l'applicazione.

Dopo la prima distribuzione mi raccomando utilizzando uno strumento di migrazioni, che vi aiuterà con ulteriori estensioni / modifiche dello schema. Se si pensa che un po 'più avanti si noterà che ancora richiede la manipolazione dei dati (ad esempio la rimozione di dati errati che è stato generato a causa di un bug) come si evolve di applicazione. Questo è tutto uno strumento di migrazione può aiutare con.

Date un'occhiata in:

Ecco un elenco dei più strumenti di migrazione per .net risposta in una domanda SO:

L'idea originale delle migrazioni ha avuto origine da Ruby on Rails ed è stato "clonato" in altri contesti oltre il passato. Ecco perché è sicuramente bene leggere l'idea originale a http://guides.rubyonrails.org/migrations. html troppo.

Se avete VS Team Suite o l'edizione Database Developer, è possibile sincronizzare e tenere traccia delle modifiche e poi fare uno script di distribuzione che creerà tutti gli oggetti giusti per voi. Anche Redgate ha un prodotto Confronta schema che fa la stessa cosa, se non sbaglio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top