如何在Fluent nHibernate中为同一个表创建两个映射?

时间:2010-08-10 14:06:12

标签: c# nhibernate fluent-nhibernate

我有一个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
)

我正在尝试将两个类映射到此表:

  • 第一个名为User的对象没有Password和PasswordSalt属性。
  • 第二个对象名为SecurityUser,继承自User并定义了Password和PasswordSalt属性。

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

我称之为User类是一个不提供任何用户敏感信息的安全对象。

现在,我已经定义了两张地图:

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创建了一个名为SecurityUser的表。我尝试使用Table("Users")函数指定相同的表,但我得到了无效的nhibernate映射。

我怎样才能实现我想做的事情?或者是否有另一种方法?

1 个答案:

答案 0 :(得分:1)

NHibernate不知道何时保存用户以及何时保存安全用户。当记录是用户时,以及当它是安全用户时,您需要在数据库中告诉NHibernate。 为了告诉你如何做到这一点,我需要知道为什么“这需要避免每次我需要查询用户时都返回密码和盐。”?当原因是表现时,你可能无法衡量差异。如果您使用User类进行报告方案,则可以更好地使用投影类来选择报告查询的结果,而不是映射的实体。