我有一个用户类,其中包含我需要保存在DB加密的用户名
public abstract class User { public virtual int Id { get; protected set; } public virtual string Username { get { return _encryptionProvider.Decrypt(SecuredUsername); } protected set { SecuredUsername = _encryptionProvider.Encrypt(value); } } [Obsolete("Use the 'Username' property -- this property is only to be used by NHibernate")] protected virtual string SecuredUsername { get; set; } }
我将User实体映射如下:
public class UserMapping : ClassMap<User> { public UserBaseMapping() { Id(user => user.Id).GeneratedBy.HiLo("100"); Map(Reveal.Member<UserBase>("SecuredUsername")).Unique(); } }
它工作正常,直到我不得不写一些LINQ语句.
User user = _session.QueryOver<User>().Where(x => x.Username == "Hamza").SingleOrDefault();
这里的问题是,当LINQ将上述语句转换为sql时,它变成如下所示:
从[dbo]中选择*.[用户]用户名如’Hamza’
正如您可能已经注意到,表中没有名为username的列但securedusername包含加密值
任何人都可以帮我解决这个问题,我需要能够使用LINQ进行查询.
解决方法
您可以使用自定义类型来加密您的用户名(而不是在User类中进行加密,在自定义类型中进行加密)请参阅
http://nhforge.org/blogs/nhibernate/archive/2009/02/22/encrypting-password-or-other-strings-in-nhibernate.aspx
User user = _session.QueryOver<User>() .Where(x => x.Username == "Hamza") .SingleOrDefault();
如果要匹配大小写不敏感,可以将值转换为自定义类型中的大写/小写.
如果你想做LIKE搜索,那么你需要看一些其他类型的索引 – 例如. Lucene.NET和NHibernate.Search
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。