2010-04-13 63 views

回答

3

由於NHibernate的與實體交易,你必須有一些標識的實體。最好有一個單獨的唯一標識字段,因爲這是NHibernate設計的工作方式,並且不會打擊它。

但是,如果你有設計限制,你真的不能有一個獨立的ID列,您可以使用現有的字段中定義的複合-ID。例如,對於審計日誌記錄,您可以使用UserId和DateTime的組合。如果記錄只寫入一次而沒有被操縱(例如審計日誌),則還應該向類映射添加mutable = false以強制執行該操作。此外,請注意,如果您確實使用了這樣的composite-id,那麼如果您將來嘗試在此實體中使用NHibernate的某些更高級功能,可能會導致問題。

+0

+1複合ID雖然我使用它們很重,我必須說問題不是那麼多... – Jaguar 2010-04-14 10:29:41

1

如果你想能夠做到對將來這個記錄的CRUD操作,你可能會重新考慮有一個ID字段。

2

我不認爲你可以避免它。 NHibernate的細節與「實體」,而不是數據庫行和實體有一個身份。

考慮一下,如果你是讀回其中的一些記錄,修改它們,試圖挽救他們會發生什麼。 NHibernate不知道要修改哪個數據庫行。當然,你不打算這樣做,但這正是NHibernate設計的目的。

所以,你要麼需要創建一個人造ID或只保存不使用NHibernate的(即直接使用SQL,您可以通過NHibernate的ISession的對象,如果你想運行)。如果數據庫空間真的很重要(即你將擁有數百萬個這樣的數據庫空間),我會推薦後一種方法,否則僞造的ID很容易添加。

1

您必須擁有某種形式的ID。在我的項目中,我只是在實體的所有字段上使用composite-id,或者在數據庫中使用任何組合鍵。

相關問題