NHibernate 1对0或1对1

NHibernate 1对0或1对1,nhibernate,Nhibernate,我有一个用例,我的第一个实体“User”可能有也可能没有“UserPreferences”。 所以,要么在UserPreferences表中没有给定用户的条目,要么最多有1个条目 我应该使用哪种关联来建模?1对1还是多对1 谢谢您可以使用多对一关联。它的FNH映射非常简单: public class UserMap : ClassMap<User> { public UserMap() { Id(x => x.Id); Map(x

我有一个用例,我的第一个实体“User”可能有也可能没有“UserPreferences”。 所以,要么在UserPreferences表中没有给定用户的条目,要么最多有1个条目

我应该使用哪种关联来建模?1对1还是多对1


谢谢

您可以使用多对一关联。它的FNH映射非常简单:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        References(x => x.Preferences)
            .Cascade.All();
    }
}
公共类用户映射:类映射
{
公共用户映射()
{
Id(x=>x.Id);
Map(x=>x.Name);
参考(x=>x.Preferences)
.Cascade.All();
}
}
现在Preferences属性可以为null,但可以将一个用户首选项实例分配给多个用户首选项实例。这可以在域模型端处理(例如,请参见DDD中的聚合根)

如果您需要数据库端的约束,那么最好使用一对一关联(通过主键):

公共类用户映射:类映射
{
公共用户映射()
{
Id(x=>x.Id);
Map(x=>x.Name);
HasOne(x=>x.Preferences)
.Cascade.All();
}
}
公共类用户首选项映射:类映射
{
公共用户首选项映射()
{
Id(x=>x.Id).GeneratedBy.Foreign(“用户”);
Map(x=>x.Name);
HasOne(x=>x.User).Constrained();
}
}
但它也有一些缺点。例如,关联必须是双向的,不支持所有删除孤立项

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();
    }
}