2011-05-15 142 views
3

我有一個用例,我的第一個實體「用戶」可能會或可能沒有「UserPreferences」。 因此,對於給定用戶或最大1條目,UserPreferences表中沒有條目。NHibernate的1到0或1到1

我應該使用哪種關聯進行建模? 1比1還是多比1?

謝謝

回答

2

您可以使用多對一的關聯。這是FNH映射很簡單:

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     References(x => x.Preferences) 
      .Cascade.All(); 
    } 
} 

現在首選項屬性可以爲空,但可以將一個用戶首選項實例分配給用戶的許多實例。這可以在域模型方面處理(例如,參見DDD中的聚合根)。

如果您需要在數據庫端的約束那就最好使用一個一對一的關聯(通過主鍵):

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     HasOne(x => x.Preferences) 
      .Cascade.All(); 
    } 
} 

public class UserPreferencesMap : ClassMap<UserPreferences> 
{ 
    public UserPreferencesMap() 
    { 
     Id(x => x.Id).GeneratedBy.Foreign("User"); 
     Map(x => x.Name); 
     HasOne(x => x.User).Constrained(); 
    } 
} 

但它也有一些缺點。例如。協會必須是雙向的,並且不支持全部刪除孤兒...