2011-05-15 103 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(); 
    } 
} 

但它也有一些缺点。例如。协会必须是双向的,并且不支持全部删除孤儿...