2010-06-23 52 views
1

對象A有一個一對多的關聯:許多對象B我是否可以使用分配的自然鍵標識符,同時仍允許NHibernate識別瞬態實例?

當我查看數據庫 - TableB - 我希望看到唯一的可讀字符串A.Name,而不是始終加入或選擇代理整數標識符以查看名稱。

我可以映射Name作爲標識符爲A,但這會導致大量的額外SELECT查詢,因爲NHibernate的不能識別的A一個實例是瞬時的還是持久的。

我想我可以使用組合鍵,將本機分配的替代鍵與自然鍵組合。這看起來不太理想,但我很想聽聽一些意見。

我真正在尋找的是使用單列自然鍵,同時允許NHibernate識別瞬態實例的策略。

  • 是否有可能?
  • 什麼是映射 - 流利還是hbm?

另一方面,如果這是一個可怕的想法,我應該依靠數據庫視圖與子選擇,請解釋。

謝謝。

回答

1

這是一個可怕的想法,您應該創建一個視圖,在需要「查看數據庫」時爲那些場合進行連接。

這是一個可怕的想法,因爲名稱不表A.

的主鍵,但我認爲你可以做到這一點,如果你把A.Name唯一約束,並將其映射作爲標識符。我不知道如果NHibernate的默認設置爲空或爲未保存值空字符串,但使用

Id(x => x.Name).GeneratedBy.Assigned().UnsavedValue(string.Empty); // or null 

如果您使用的String.Empty比A的構造函數必須初始化名稱的String.Empty你可以指定它。我還會從A中刪除代理標識符,也可能是表本身,因爲它沒有任何用處。

+0

可怕的想法 - 罰款。爲什麼? – Jay 2010-06-23 18:44:55

+0

對不起,我已經擴展了它。 – 2010-06-23 18:57:58

+0

感謝您的更新。使用'UnsavedValue()'的問題是,我永遠不能堅持它 - 只要我分配一個名稱,NHibernate會將它視爲已保存,不是? – Jay 2010-06-23 19:21:43

相關問題