【问题标题】:Retrieve a single row and column with nhibernate and convert it to a string使用 nhibernate 检索单行和单列并将其转换为字符串
【发布时间】:2025-12-24 20:30:07
【问题描述】:

我正在使用 Salt 在 MVC 4.0 中创建登录功能。每个注册用户的 Salt 都是不变的,因为安全性不必是一流的。现在要创建散列(与数据库中的散列进行比较),我需要从数据库中检索特定用户的盐,并使用已插入的密码创建散列。我使用 Nhibernate 进行数据库流量。然而,由于我对 Nhibernate 还很陌生,我不知道如何将盐作为字符串检索,我尝试了这个:

 var salt = session.QueryOver<Translator>()
     .Where(x => x.EmailAddress == emailAddress)
     .Select(x => x.Salt)
     .List()
     .ToString();

x 在哪里。是映射,emailAddress 是函数中的参数。 该错误提到盐值(它实际上显示了字符串)不是 models.translator 类型,不能在这个泛型集合中使用。

【问题讨论】:

  • 为什么不使用默认的 SimpleMembership 和 salt 密码?
  • 我有这个任务,我必须使用某些选项,比如加密到 pbkdf2 的哈希值.. SimpleMembership 不包括对吗?
  • 请注意,在 MVC 4 和 ASP.NET 4 和 4.5 中,默认哈希现在是 HMACSHA256。
  • 也许这个话题可以帮到你:*.com/questions/12236533/…
  • 是的,但是我还是有点坚持我必须用于作业的东西。希望我能用简单的解决方案

标签: c# nhibernate


【解决方案1】:

获取整个实体然后获取它的.Salt 属性并不昂贵,因此您可以放心地忘记Select 部分。

但是,在条件 API 中,我知道您可以在查询中使用 .SetProjection() 来获取单个属性,然后调用 .UniqueResult&lt;string&gt;()

使用QueryOver,您可以尝试.List&lt;string&gt;()。不要在列表上调用.ToString(),而是使用.Single() 获取列表中唯一的元素。

【讨论】:

  • 是的,List&lt;string&gt;(或SingleOrDefault&lt;string&gt;,如果是单个条目)应该没问题。 LINQ 提供程序也可用于获得相同的结果。
  • 嗯,当我读到这些作品时,它们似乎解决了这个难题,但我在创建正确的语法来完成这个难题时遇到了一点麻烦。你有机会给我举个例子吗?
  • 这里有一个官方的例子,段落中的第三个:nhforge.org/doc/nh/en/index.html#queryqueryover-querystructure。因此,我怀疑它不是您的 .List().ToString(),而是 .List().Single(),甚至是 @Patryk 建议的 .Single()。如果可能没有行,请将 Single 更改为 SingleOrDefault。
  • 是的,我看到了那个例子并尝试了它,显然问题不在于这种语法,而是在其他地方,因为我得到的错误显示我想从数据库中检索的盐字符串很好,但是它似乎不能在这个通用集合中使用..虽然,我不知道这意味着什么..