2010-01-07 9 views
2

Как выполнить инструкцию DDL через NHibernate?Использование NHibernate для выполнения операторов DDL

Чтобы быть ясным, I не хочу автоматически генерировать мою схему из моих файлов сопоставления. Мой DDL хранится в виде текстовых файлов по строкам:

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

Я хочу, чтобы цикл через них в порядке и выполнить каждый из них. Я мог бы просто открыть SqlConnection и выполнить через SqlCommand, но я бы хотел пройти NHibernate, если есть хороший способ сделать это. Это связано главным образом с тем, что я хочу как можно скорее агрегировать базу данных: у меня есть SQL db, но мне может понадобиться позже реализовать Oracle или DB2 ...

Я использую .Net v3.51 и NHibernate v2. 1. Я посмотрел класс NHibernate SchemaExport, но не смог увидеть способ использовать его для этой цели.

ответ

1

Вы можете получить IDbConnection из свойства Connection ISession, но вам нужно будет сделать это с помощью SqlCommand. Выполнение DDL выходит за рамки области NHibernate.

+0

Я хочу, чтобы эта база данных агностик - есть простой способ сделать это, например, будет ли Nhibernate дать мне IDbCommand? – Steve

+1

Вызов IDbConnection.CreateCommand возвращает IDbCommand. Но я не думаю, что вы можете достигнуть DDD агностики базы данных, за исключением простых случаев. –

3

Я использовал session.Connection.CreateCommand и session.Transaction.EnlistCommand, прежде чем с успехом запустить сырой SQL.

Вот фрагмент чего-то подобного, что я сделал:

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()) 
     // ... 
    } 
}