如何为插入/更新生成nHibernate原始sql而不执行?

时间:2017-07-17 11:22:50

标签: c# .net nhibernate

是否可以使用nHibernate为插入/更新操作生成原始SQL语句而无需实际执行它们?当然假设所有内容(映射,connectionStrings等)都已正确配置?

我发现的最接近的事情是致电:

Session.SessionFactory.GetClassMetadata(typeof(Client))

返回包含SQLIdentityInsertString的SingleTableEntityPersister类型的对象,如下所示:

INSERT INTO Client (FirstName, LastName) values (?, ?)

但它仍然需要我手动绑定所有属性,并且在SQLIdentityInsertString之上是受保护的属性。有没有正确的方法呢?

1 个答案:

答案 0 :(得分:1)

好的,我发现最接近的是用字符串生成器构建自己的sql查询。首先,您需要提取类元数据:

var metaData = Session.SessionFactory.GetClassMetadata(typeof(Client)) as SingleTableEntityPersister;

然后您可以检索其他信息,例如:

var propertyNames = metaData.PropertyNames;
var tableName = metaData.TableName;
var firstPropertyValue = metaData.GetPropertyValue(client, propertyNames[0], EntityMode.Poco);

获得该信息后,您可以手动构建自己的查询。我认为不完全是我想要的解决方案,但它与它的关系一样接近。

但是,有一点需要注意的是,Session.CreateSQLQuery(string)方法目前存在漏洞,因此SetParameter方法不能处理10个以上的命名参数。似乎已经在NHbiernate的Jira上为此创建了一个错误报告。