2010-01-07 6 views
2

Comment puis-je exécuter une instruction DDL via NHibernate?Utilisation de NHibernate pour exécuter des instructions DDL

Pour être clair, je ne souhaite pas générer automatiquement mon schéma à partir de mes fichiers de mappage. Mon DDL est stocké dans des fichiers de texte en clair sur les lignes de:

CREATE TABLE Foo (Bar VARCHAR(10)) 
GO 
CREATE TABLE Hello (World INTEGER) 
GO 

Je veux les parcourir dans l'ordre et exécuter chacun d'eux. Je pourrais simplement ouvrir un SqlConnection et l'exécuter via un SqlCommand mais j'aimerais passer par NHibernate s'il y a une bonne façon de le faire. C'est principalement parce que je veux rester aussi agnostique de base de données que possible: J'ai un SQL DB maintenant mais je pourrais avoir besoin d'implémenter Oracle ou DB2 plus tard ...

J'utilise .Net v3.51 et NHibernate v2. 1. J'ai regardé la classe NHibernate SchemaExport mais je n'ai pas trouvé de moyen de l'utiliser dans ce but.

Répondre

1

Vous pouvez obtenir une IDbConnection à partir de la propriété Connection d'ISession, mais vous devez le faire avec SqlCommand. L'exécution de DDL est en dehors de la portée de NHibernate.

+0

Je veux faire de cette base de données agnostique - est-il un moyen simple de le faire par exemple Nhibernate me donnera-t-il un IDbCommand? – Steve

+1

L'appel IDbConnection.CreateCommand renvoie un IDbCommand. Mais je ne pense pas que vous pouvez obtenir une base de données agnostique DDL sauf pour les cas simples. –

3

J'ai utilisé session.Connection.CreateCommand et session.Transaction.EnlistCommand avant d'avoir réussi à exécuter du SQL brut.

Voici un extrait de quelque chose de similaire que je l'ai fait:

using (var command = _session.Connection.CreateCommand()) 
{ 
    _session.Transaction.Enlist(command); 
    command.CommandText = "select foo from bar where id = @id"; 
    var versionIdParameter = command.CreateParameter(); 
    versionIdParameter.ParameterName = "id"; 
    versionIdParameter.Value = id; 
    command.Parameters.Add(versionIdParameter); 
    using(var reader = command.ExecuteReader(CommandBehavior.SequentialAccess)) 
    { 
     while (reader.Read()) 
     // ... 
    } 
} 
Questions connexes