【问题标题】:How to have two mapping for the same table in Fluent nHibernate?如何在 Fluent nHibernate 中对同一个表进行两个映射?
【发布时间】:2010-08-11 02:59:10
【问题描述】:

我有一个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 映射。

我怎样才能实现我想要做的事情?还是有其他方法?

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate


    【解决方案1】:

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

    【讨论】:

    • SR-43: Sensitive information (see glossary, SR-39) shall not be accessible when querying a user or a list of users. 基本上,存在此要求是为了防止线外窃听。由于我们在数据层上使用 nHibernate,我希望能够在没有密码的情况下返回用户,同时仍然能够在注册或更改密码时设置密码。 SecurityUser 永远不会通过服务返回,只能在内部使用。
    • 在这种情况下,您可以更好地通过网络发送哑 DTO 而不是复杂的 NHibernate 实体。 stackoverflow 上有关此主题的问题数量可以说服您使用 DTO 而不是网络上的实体。我并不是说不能通过网络发送实体来制作一个好的应用程序,但它比使用 DTO 更难创建。使用 automapper 之类的工具,您只需要定义 DTO,automapper 就可以自动将您的实体映射到 DTO。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2010-12-09
    • 2010-12-07
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多