2011-05-29 55 views
5

In his blog,Ayende建議使用一對一可能不是實現傳統1:1對象關係的最佳方式(例如customer.Name == name.Customer)。NHibernate一對一vs 2多對一

  1. 如何選擇何時使用一對一關係?
  2. 我爲什麼要選擇2一個一對多的關係
  3. 如何在一到一個工作(有沒有FK列生成)

一對一:

One-to-one

2多到一個:

enter image description here

+0

您確定沒有生成FK列嗎?對我來說,它們是生成的,並且數據庫看起來像是一對多的關係。也許你錯誤地使用了「Invserse」雙方? – 2011-05-30 10:14:37

+0

是的,我確定 - 一對一表看起來像實體,沒有FK鍵。 – Darbio 2011-05-30 11:07:00

+2

有兩種方法可以進行一對一的操作。您生成它的方式,它使用這兩個實體的主鍵來加入它們。在第二種情況下,您有一個具有唯一約束的外鍵http://nhforge.org/doc/nh/en/index.html#mapping-declaration-onetoone – Vadim 2011-05-30 20:13:17

回答

2

我遇到過使用一對多映射的唯一原因是性能。

我最初一直以一對一的方式直到項目遇到性能問題。發生問題是因爲您通常無法在反面進行一對一映射的延遲加載。例如。當您擁有可以(但不必)在該映射上具有相關實體B的實體A時。在這種情況下,對於您加載的每個實體A,實體B也會加載。這樣做是爲了防止檢查相關對象是否存在錯誤。代理的延遲加載會誤導你認爲相關的實體存在,即使它不存在。如果您檢查相關的實體存在,這樣你會在一個問題

if (entityA.EntityB == null) HandleNoEntityB(); 

如果你使用一個一對多的映射然而,延遲加載是沒有問題的,因爲開發人員都使用一個集合,我們可以創建代理。

if (entityA.EntitiesB.Count == 0) HandleNoEntityB(); 

這並不一定是一個問題,如果你可以讓你的系統的假設,即實體A始終有且只有一個相關實體B.在這種情況下,你應該設置該contrained =「真」映射。