是否可以使用nHibernate为插入/更新操作生成原始SQL语句而无需实际执行它们?当然假设所有内容(映射,connectionStrings等)都已正确配置?
我发现的最接近的事情是致电:
Session.SessionFactory.GetClassMetadata(typeof(Client))
返回包含SQLIdentityInsertString的SingleTableEntityPersister类型的对象,如下所示:
INSERT INTO Client (FirstName, LastName) values (?, ?)
但它仍然需要我手动绑定所有属性,并且在SQLIdentityInsertString之上是受保护的属性。有没有正确的方法呢?
答案 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上为此创建了一个错误报告。