流畅的NHibernate映射:一对一(或无)

时间:2014-09-01 13:12:29

标签: c# nhibernate fluent-nhibernate one-to-one fluent-nhibernate-mapping

我有一个以下数据库方案设置,我无法真正改变。

User
----
Id    (primary key)
[Some simple properties...]


UserAdditionalData
------------------
Id     (primary key)
[Some simple properties...] 
USERID (foreign key to User)

很明显,User表确实没有任何记忆,无论它是否与UserAdditionalData记录相关联,所以我认为我不能称之为真正的记录。 - 这里的映射,因为它们也不共享互斥的PK。

但是,在实践中,我希望能够处理User对象,例如检查它是否有UserAdditionalData记录,如果有,请访问其属性。

我已经设置了我的BDO:

public class User
{
    [Some simple properties...] 
    public virtual UserAdditionalData UserAdditionalData { get; set; }
}

public class UserAdditionalData
{
    [Some simple properties...] 
    public virtual User User { get; set; }  /* I have this here, 
                                               but I don't really ever 
                                               have to access it in this 
                                               direction */
}

我已经设置了我的映射:

    public UserMapping()
    {
        Table("USER");
        [Some simple properties...] 
        HasOne(x => x.UserAdditionalData).Cascade.None();
    }


    public UserExtraMapping()
    {
        Table("USER_ADDITIONAL_DATA");
        [Some simple properties...] 
        References(x => x.User, "USERID").Unique();
    }

这都是编译,但我看到我的UserExtra对象(通过User对象访问时)始终为null。 我已经尝试了很多不同的方法来解决它,阅读很多关于实现这个作为一对多。但是,我仍然无法让它发挥作用。

非常感谢任何帮助。

谢谢!

[小更新]:我只需要查询数据库,如果与任何方式相关,则不保存。

1 个答案:

答案 0 :(得分:1)

根据您的 小更新 ,我会使用简化的映射。我们将从NHibernate实际映射功能中获益,并优化用户负载。所有这些因为我们确实需要只读映射。

首先,我们应该在附加

上引入简单的int属性UserId
// extra class is having an int property containig the foreign key
public class UserAdditionalData
{
    public virtual int UserId { get; set; }
}

// that would be the mapping:
public UserExtraMapping()
{
    ...
    Map(x => x.UserId, "USERID");
}

现在,我们将使用优化的映射来延迟加载many-to-one (即与一对一的比较,它总是加载两端,这里我们只有在真正需要的时候才能获得参考数据! )

public UserMapping()
{
    ...
    References(x => x.UserAdditionalData)
          .LazyLoad()
          .PropertyRef(e => e.UserId)
          .Not.Insert()
          .Not.Update()
          ;
}

因此,对于readonly,我会尽力使用many-to-one映射(References()

另见: