彻底检查电子邮件是不是存在,NHibernate,LINQ
Posted
技术标签:
【中文标题】彻底检查电子邮件是不是存在,NHibernate,LINQ【英文标题】:Thoroughly Check to see if an Email Exists, NHibernate, LINQ彻底检查电子邮件是否存在,NHibernate,LINQ 【发布时间】:2010-12-10 21:35:23 【问题描述】:对于我的身份验证模型,我想确保同一电子邮件不可能被多次注册。我是 nHibernate 和部分 LINQ 的新手,所以我问这是否足以“检查”以确保发生这种情况。
public MembershipCreateStatus CreateUser(string email, string password)
if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", "userName");
if (String.IsNullOrEmpty(password)) throw new ArgumentException("Value cannot be null or empty.", "password");
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
var members = session.CreateCriteria<Member>().List<Member>();
// determine is the email address already exists in the database
if (members.Any(i => i.Email == email))
return MembershipCreateStatus.DuplicateEmail;
// create the new member, if they are valid
var member = new Member Email = email ;
session.SaveOrUpdate(member);
transaction.Commit();
return MembershipCreateStatus.Success;
有没有更智能的方法来实现这一点?过去我在以前的程序中遇到过这个问题(我在那个程序上使用了 Linq to SQL),所以这次我想得到一些专家的建议。
【问题讨论】:
@Femaref:没有抱怨,但你改变了什么?我无法识别任何变化。 我不一定知道如何在 NHibernate 中这样做,但是您需要确保您创建的事务是可序列化的,以便在您检查的时间之间不会插入重复的电子邮件地址以及您执行插入的时间。 斯泰西:格式化。您的某些代码没有被格式化,因为它没有正确缩进。 您还应该在数据库中添加唯一约束,以验证您的表从不包含重复记录。这也将有助于优化数据库查询。 Hrnm。这是有道理的……不过,我不知道该怎么做。 【参考方案1】:你正在做的是加载所有成员并查询内存中的集合。
这会在数据库中执行查询:
//this of course goes inside the transaction
if session.Query<Member>().Any(i => i.Email == email))
return MembershipCreateStatus.DuplicateEmail;
【讨论】:
谢谢,这非常有用。在数据库端查询它会快很多。很难选择两个答案中的哪一个来标记为已接受的答案,因为两者都非常有帮助。我希望我能标记他们两个。 没关系;最适合您的应该是公认的答案:-)【参考方案2】:如约翰所说,创建一个独特的约束。您可以从这个问题中弄清楚如何做到这一点:
SQL Server 2005 How Create a Unique Constraint?
这将确保不会发生重复。
【讨论】:
有什么方法可以在您知道的 fluent nHibernate 中关联此映射? @Stacey 你应该可以指定它像 Map(x => x.Email).Unique();以上是关于彻底检查电子邮件是不是存在,NHibernate,LINQ的主要内容,如果未能解决你的问题,请参考以下文章