使用NHibernate执行DDL语句
问题描述:
如何通过NHibernate执行DDL语句?使用NHibernate执行DDL语句
要清楚,我不要想要从我的映射文件自动生成我的模式。我的DDL存储在纯文本文件中:
CREATE TABLE Foo (Bar VARCHAR(10))
GO
CREATE TABLE Hello (World INTEGER)
GO
我想循环遍历这些命令并执行它们中的每一个。我可以打开一个SqlConnection,并通过SqlCommand执行,但如果有一个很好的方法来做到这一点,我想通过NHibernate。这主要是因为我想尽可能保持数据库不可知:我现在有一个SQL数据库,但我可能需要稍后实现Oracle或DB2 ...
我使用.Net v3.51和NHibernate v2。 1。我查看了NHibernate SchemaExport类,但看不到用于此目的的方法。
答
您可以从ISession的Connection属性获得IDbConnection,但您需要使用SqlCommand来完成此操作。执行DDL不在NHibernate的范围内。
答
我以前用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())
// ...
}
}
我想使这个数据库无关 - 有没有这样做例如一个简单的方法Nhibernate会给我一个IDbCommand吗? – Steve 2010-01-07 19:49:47
调用IDbConnection.CreateCommand返回一个IDbCommand。但我不认为你可以实现数据库不可知的DDL,除了简单的情况。 – 2010-01-07 19:54:01