代码之家  ›  专栏  ›  技术社区  ›  user1211204

Fluent NHibernate映射:一对一(或无)

  •  2
  • user1211204  · 技术社区  · 10 年前

    我有一个如下的数据库方案设置,我真的无法更改。

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

    很明显 User 表实际上不记得它是否与 UserAdditionalData 记录,所以我认为我不能在这里称之为真正的一对一映射,因为它们也不共享互斥的PK。

    然而,在实践中,我希望能够 使用者 对象,例如检查它是否具有 用户附加数据 记录,如果是,访问其财产。

    我已将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对象访问时)总是空的。 我已经尝试了很多不同的方法来实现它,阅读了很多关于实现这一点的一对多。然而,我仍然无法让它发挥作用。

    任何帮助都将不胜感激。

    谢谢

    [小更新]: 我只需要查询数据库,而不必在任何方面相关的情况下保存到数据库。

    1 回复  |  直到 10 年前
        1
  •  1
  •   Radim Köhler    10 年前

    基于您的 小更新 ,我会使用简化的映射。我们将从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()
              ;
    }
    

    所以,对于只读,我会尽可能使用 多对一 映射( References() )

    另请参见: