2017-07-17 94 views
0

是否有可能使用nHibernate爲插入/更新操作生成原始SQL語句而不實際執行它們?當然,假設一切(映射,連接字符串等)都已正確配置?如何爲插入/更新生成nHibernate原始sql而不執行?

我發現的最接近的事情就是打電話:

Session.SessionFactory.GetClassMetadata(typeof(Client)) 

返回包含SQLIdentityInsertString類型SingleTableEntityPersister的對象,看起來像這樣:

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

但它仍然需要我手動綁定所有的屬性,並且最重要的是SQLIdentityInsertString是一個保護屬性。有沒有適當的方法來做到這一點?

+0

你爲什麼要這樣做? – mjwills

+0

我需要從XML文件導入大量的客戶端到數據庫中。有多個查詢需要執行,但是如果我有用於插入/更新操作的原始SQL,則只需一個查詢即可完成。我已經用硬編碼的SQL查詢對它進行了測試,但這當然不是很好維護(即使它確實提供了顯着的加速)。我想在運行時生成代碼,使用現有的nHibernate配置和映射,而不是手動完成。 –

+0

我想有一個攔截器接口或基類中的一個方法,它會爲您提供將要使用的SQL字符串:OnPrepareStatement()。你可以利用這一點,但我認爲你必須先模擬工作,然後回滾事務。 –

回答

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上爲此創建了一個錯誤報告。

+0

5個小時前創建:[NH-4053](https://nhibernate.jira.com/browse/NH-4053)。 –

相關問題