Nhibernate icriteria问题

Nhibernate icriteria问题,nhibernate,s#arp-architecture,Nhibernate,S#arp Architecture,我正在覆盖sharp体系结构存储库方法,如下所示: public class UserRepository : NHibernateRepository<User>, IUserRepository { public override User SaveOrUpdate(User entity) { ICriteria Criteria = Session.CreateCriteria(typeof(User)); Criteria.A

我正在覆盖sharp体系结构存储库方法,如下所示:

public class UserRepository : NHibernateRepository<User>, IUserRepository
{
    public override User SaveOrUpdate(User entity)
    {
        ICriteria Criteria = Session.CreateCriteria(typeof(User));
        Criteria.Add(Expression.Eq("Email", entity.Email));
        User User = Criteria.UniqueResult<User>();

        if (User != null)
        {
        if (User.Id != entity.Id)
        {
            throw new ArgumentException("Please use a unique email address.");
        }
        }

        return base.SaveOrUpdate(entity);
    }
}
ICriteria总是返回一个实体,因此即使数据库中没有任何内容,也总是抛出异常

有人知道这是为什么吗?不应该是这样的,不是吗?我一定是忽略了一些显而易见的事情

谢谢

基督教徒

附言:

这是更完整的代码:

namespace x.Domain.Contracts.Repositories
{
    using SharpArch.Domain.PersistenceSupport;
    using SharpArch.NHibernate.Contracts.Repositories;

    public interface IUserRepository : INHibernateRepository<User>
    {
    }
}

namespace x.Tasks.Repositories
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Domain;
    using Domain.Contracts.Tasks;
    using Domain.Contracts.Repositories;
    using SharpArch.NHibernate;
    using NHibernate;
    using NHibernate.Criterion;

    public class UserRepository : NHibernateRepository<User>, IUserRepository
    {
        public override User SaveOrUpdate(User entity)
        {
            ICriteria Criteria = Session.CreateCriteria(typeof(User));
            Criteria.Add(Expression.Eq("Email", entity.Email));
            User User = Criteria.UniqueResult<User>();

            if (User != null)
            {
                if (User.Id != entity.Id)
                {
                    throw new ArgumentException("Please use a unique email address.");
                }
            }

            return base.SaveOrUpdate(entity);
        }
    }
}

namespace x.Tasks
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Domain;
    using Domain.Contracts.Tasks;
    using SharpArch.NHibernate.Contracts.Repositories;
    using NHibernate.Criterion;
    using NHibernate;
    using x.Web.Mvc.Controllers.ViewModels;
    using SharpArch.NHibernate.Web.Mvc;
    using x.Domain.Contracts.Repositories;

    public class UserTasks : IUserTasks
    {
        private readonly IUserRepository UserRepository;

        public UserTasks(IUserRepository UserRepository)
        {
            this.UserRepository = UserRepository;
        }

        [Transaction]
        public void CreateUser(CreateUserViewModel CreateUserViewModel)
        {
            User User = new User();
            User.ForeName = CreateUserViewModel.ForeName;
            User.LastName = CreateUserViewModel.LastName;
            User.Email = CreateUserViewModel.Email;
            User.Password = CreateUserViewModel.getSHA512PW(CreateUserViewModel.Password1);

            UserRepository.SaveOrUpdate(User);
        }
    }
}
即使我对ICriteria位进行注释,该实体甚至不会得到持久化,尽管存在事务属性。有什么想法吗

缴费灵:

更多详细信息和堆栈跟踪:

{查询未返回唯一的结果:7}

位于NHibernate.Impl.AbstractQueryImpl.UniquelementList 在NHibernate.Impl.CriteriaImpl.UniqueResult 在NHibernate.Impl.CriteriaImpl.UniqueResultT 位于C:\Users\csetzkorn\Documents\Visual Studio 2010\Projects\EID2\Solutions\EID2.Tasks\Repositories\UserRepository.SaveOrUpdateUser实体中的EID2.Tasks\Repositories\UserRepository.cs:第19行 位于C:\Users\csetzkorn\Documents\Visual Studio 2010\Projects\EID2\Solutions\EID2.Tasks\UserTasks.CreateUserViewModel中的EID2.Tasks.UserViewModel CreateUserViewModel:第33行
在C:\Users\csetzkorn\Documents\visualstudio 2010\Projects\EID2\Solutions\EID2.Web.Mvc\Controllers\userscoontroller.cs中的EID2.Web.Controllers.userscoontroller.CreateUserViewModel CreateUserViewModel CreateUserViewModel中,我认为NHibernate正在从其一级缓存检索实体实例,这意味着已经对实体调用了Save,或者由于关系将其设置为持久化。用户对象是否与实体对象相同?如果是,您可以检查引用是否相等:

if (user != entity) throw new ArgumentException("...");

无论您如何使其工作,都有可能另一笔交易在您的支票和提交的交易之间插入了具有相同电子邮件地址的用户。对于大多数应用程序来说,这是一个很小的风险,但我认为最好的防范方法是对数据库列设置唯一的约束并处理异常。

如果数据库中没有任何内容,它就不能返回实体。因此,您可能没有查看正确的数据库。检查您的配置和数据库服务器。该错误意味着Criteria.UniqueResult返回了7行,因此您不能有唯一的约束。如果用户!=实体给我一个true,数据库中没有任何内容。我检查了一切!你得到的是同一个用户吗?比较用户名或其他字段。哦,天哪,我怀疑我使用了错误的连接,并查看了旧数据库。我星期一去看看。谢谢你,对这一切感到抱歉。。。