2013-03-24 29 views
0

我有一個實體Account,在正常情況下,它會產生由NHibernate生成的Guid Id。但是,有幾個Account我想要「硬編碼」,這些帳戶將在任何地方被引用並提供非常特定的功能。Nhibernate在實體上預先設定的ID,不能讓它堅持

我想在配置文件中定義這些對象,並使用預配置的Guid Id來完成,並且在啓動我的應用程序時,檢查這些帳戶是否存在於數據庫中。如果他們不這樣做,我想按照原樣添加它們。如果他們在那裏,我想覆蓋數據庫版本並保存從配置文件中設置的屬性。

我以爲自己,這似乎是ISession.Merge是爲了什麼,但對象沒有持久。然後我自己想,這一定是ISession.Persist的目的,但是會拋出一個抱怨持久分離對象的異常。 ISession.SaveOrUpdate同樣不堅持的對象。

我需要做什麼才能在NHibernate中堅持這幾個「預製」對象?

+0

聽起來像問題是有時你想自己生成ID,而其他時候你想要NH生成ID。我想你需要創建一個自定義的'IIdentifierGenerator',但我從來沒有這樣做過。 – 2013-03-25 02:45:12

回答

0

將這些預定義的Guid放在字符串常量中。從字符串常量中可以創建Guid實例。在應用程序啓動時,使用這些GUID查詢DB的對象。如果發現更新對象並在數據庫中進行更新。如果找不到,則使用預定義的GUID創建對象實例並執行插入操作。

換句話說,這些「預製」對象沒有什麼特別之處。將它們視爲沒有預定義ID的其他任何常規對象。

更新:它不是那麼簡單。 NHibernate可能會嘗試用新的Guid來填充ID,問題是如何告訴NHibernate有時候你想自己做這件事?

Session.Merge會首先嚐試從Db加載實體,如果發現它會將內存實例與from-db實例合併。否則,它會將新實例添加到數據庫。

您可以直接使用ADO.NET直接添加此預定義實體,手動跳過NH,但這不是一個很好的解決方案。

+0

聽起來很簡單吧?這基本上是我所做的(少了常量字符串部分,但我不認爲這真的有關),但NHibernate不會堅持他們。 – 2013-03-25 00:09:19

0

如果您的映射表示NH將生成Id,那麼您無法使用NH插入特定的Id。

既可以使用臨時SqlQuery,也可以爲具有assigned ID的初始化創建部分修改的映射配置。