我的應用程序中有一些類不需要持久化ID。這些可能是用戶日誌或審計記錄。我可以給他們添加一個仲裁ID,但我想避免這種情況,因爲他們沒有任何意義。對於沒有ID的對象,使用NHibernate的最佳方式是什麼?
這些對象的檢索總是在另一個關鍵(如用戶ID),這是不是唯一的記錄。
我的應用程序中有一些類不需要持久化ID。這些可能是用戶日誌或審計記錄。我可以給他們添加一個仲裁ID,但我想避免這種情況,因爲他們沒有任何意義。對於沒有ID的對象,使用NHibernate的最佳方式是什麼?
這些對象的檢索總是在另一個關鍵(如用戶ID),這是不是唯一的記錄。
由於NHibernate的與實體交易,你必須有一些標識的實體。最好有一個單獨的唯一標識字段,因爲這是NHibernate設計的工作方式,並且不會打擊它。
但是,如果你有設計限制,你真的不能有一個獨立的ID列,您可以使用現有的字段中定義的複合-ID。例如,對於審計日誌記錄,您可以使用UserId和DateTime的組合。如果記錄只寫入一次而沒有被操縱(例如審計日誌),則還應該向類映射添加mutable = false以強制執行該操作。此外,請注意,如果您確實使用了這樣的composite-id,那麼如果您將來嘗試在此實體中使用NHibernate的某些更高級功能,可能會導致問題。
如果你想能夠做到對將來這個記錄的CRUD操作,你可能會重新考慮有一個ID字段。
我不認爲你可以避免它。 NHibernate的細節與「實體」,而不是數據庫行和實體有一個身份。
考慮一下,如果你是讀回其中的一些記錄,修改它們,試圖挽救他們會發生什麼。 NHibernate不知道要修改哪個數據庫行。當然,你不打算這樣做,但這正是NHibernate設計的目的。
所以,你要麼需要創建一個人造ID或只保存不使用NHibernate的(即直接使用SQL,您可以通過NHibernate的ISession的對象,如果你想運行)。如果數據庫空間真的很重要(即你將擁有數百萬個這樣的數據庫空間),我會推薦後一種方法,否則僞造的ID很容易添加。
您必須擁有某種形式的ID。在我的項目中,我只是在實體的所有字段上使用composite-id,或者在數據庫中使用任何組合鍵。
+1複合ID雖然我使用它們很重,我必須說問題不是那麼多... – Jaguar 2010-04-14 10:29:41