2012-11-08 59 views
0

我在數據庫中有用戶表,並且我創建了用於從該表中獲取數據的Nhibernate映射。我創建了動態映射,該映射返回響應而不是用戶類型的哈希表列表,因爲用戶沒有物理類。我對獲取和保存數據的代碼如下:如何在nhibernate中保存動態對象

dynamic user = null; 
using (ISession session = factory.OpenSession()) 
{ 
    user = session.CreateQuery("select u from User as u").List(); 

    user[0]["LastName"] = "s"; 
    session.Save(user[0]); 
    session.Flush(); 
} 

using (ISession otherSession = factory.OpenSession()) 
{ 
    user[0]["LastName"] = "ssss"; 
    otherSession.Save(user[0]); 
    otherSession.Flush(); 
} 

現在,在第一種情況下,當我取數據,並將其保存在同一個會議上,它的工作原理。但在第二種情況下,當我在一個會話中獲取數據,然後在另一個會話中保存同一個對象時,它不起作用。我得到錯誤:「沒有persister:System.Collections.Hashtable」。我現在認爲它是一種奇怪的要求,但如果有人知道我能做到的任何方式,我會感激的。

我的用戶表NHibernate的映射如下:

<hibernate-mapping xmlns='urn:nhibernate-mapping-2.2' > 
    <class entity-name='User' table='`User`'> 
     <id name='UserId' column='`UserId`' type='string'> 
     <generator class='identity'> 
     </generator> 
     </id> 
     <property name='CreatedOn' column='`CreatedOn`' type='DateTime' /> 
     <property name='FirstName' column='`FirstName`' type='string' /> 
     <property name='LastName' column='`LastName`' type='string' /> 
     <property name='LastUserNewResultAcknowledgedTime' column='`LastUserNewResultAcknowledgedTime`' type='string' /> 
     <property name='LoginName' column='`LoginName`' type='string' /> 
     <property name='LoginPassword' column='`LoginPassword`' type='string' /> 
     <property name='ModifiedBy' column='`ModifiedBy`' type='string'/> 
     <property name='ModifiedOn' column='`ModifiedOn`' type='DateTime' /> 
    </class> 
</hibernate-mapping>" 
+2

似乎你並沒有使用動態,因爲這是一個常規的類映射。您報告的錯誤可能是由於忘記了「Embedded Resource」作爲hbm文件上的標誌。 –

+0

@FelicePollano,我會說這是** dnymic模型**映射。雖然它看起來與類(在.hbm.xml文件中)相同,但它將被轉換爲字典而不是「User」類(請參閱我的答案中的鏈接) –

回答

1

看來你正確地做的一切。映射似乎是OK (並且在第一種情況下已經生成)。所以你的動態模型是好的。看到更多的在這裏:

http://nhibernate.info/doc/nh/en/index.html#persistent-classes-dynamicmodels

什麼可能缺少(這是不是在你的片段所示)是明確的開關dynamic-map。它可以在您的工廠或配置來實現,當你得到一個會話使用明確的參數EntityMode.Map

using (ISession otherSession = factory.OpenSession(EntityMode.Map)) 
{ 
... 
} 

因爲如果會話期待POCO(有User類存在),併爲提供Hashtable(來自上一個會話,所以現在真的是分離的對象),它無法找到它的持久化。

+1

這解決了我今天發佈的問題!謝謝! –

+0

很高興看到這一點 –