代码之家  ›  专栏  ›  技术社区  ›  Pierre-Alain Vigeant

在Fluent NHibernate中,如何对同一个表进行两次映射?

  •  0
  • Pierre-Alain Vigeant  · 技术社区  · 14 年前

    我有一个 User 表定义如下:

    CREATE TABLE Users(
        UserId int IDENTITY(1,1) NOT NULL,
        UserName varchar(128) NOT NULL,
        Name nvarchar(200) NOT NULL,
        Password binary(64) NOT NULL,
        PasswordSalt binary(16) NOT NULL
    )
    

    我试着用两个类映射到这个表:

    • 第一个对象 用户 没有密码和密码盐属性。
    • 第二个对象 SecurityUser 继承 用户 并定义密码和密码盐属性。

    这背后的想法是 安全用户 是需要中间服务来修改密码的内部对象。这是为了避免每次我需要查询用户时都返回密码和salt。

    这个 用户 我所说的类是一个不提供任何用户敏感信息的安全对象。

    现在,我定义了两个映射:

    public class UserMap : ClassMap<User>
    {
        protected UserMap()
        {
            Id(x => x.Id);
            Map(x => x.UserName);
            Map(x => x.Name);
        }
    }
    

    public class SecurityUserMap : SubclassMap<SecurityUser>
    {
        protected SecurityUserMap()
        {
            Map(x => x.Password);
            Map(x => x.PasswordSalt);
            Table("Users");
        }
    }
    

    问题是nhibernate创建了一个名为 安全用户 . 我试着用 Table("Users") 函数来指定同一个表,但随后得到的nhibernate映射无效。

    我如何才能实现我正在尝试的目标?或者有其他方法吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Paco    14 年前

    nhibernate不知道何时保存用户以及何时保存安全用户。您需要数据库中的一些内容来告诉nhibernate何时记录是用户,何时记录是安全用户。 为了告诉你怎么做,我需要知道为什么“每次我需要查询一个用户时,都需要这样做来避免返回密码和salt。”?当原因是性能时,您可能无法测量差异。如果将用户类用于报告方案,则最好使用投影类来选择要报告的查询结果,而不是映射的实体。