Skip to main content
 首页 » 编程设计

c#之使用 NHibernate 的 Web 服务中的 "Could not execute query error"

2024年08月06日49arxive

正如标题所说,我收到了这个错误:

could not execute query
[ SELECT this_.Id as Id5_0_, this_.Username as Username5_0_, this_.PasswordHash as Password3_5_0_, this_.Salt as Salt5_0_, this_.Token as Token5_0_, this_.TokenStamp as TokenStamp5_0_, this_.Role as Role5_0_ FROM User this_ ]"
error when breakpointing.

我正在尝试使用数据库中的用户进行简单登录,用户在其中输入用户名和密码哈希值。我有一个用户数据,其中每一列都有 Admin 用于调试。

这是我的代码:

SQL Server 数据库:

用户表:

CREATE TABLE [dbo].[User]  
( 
    [Id]           UNIQUEIDENTIFIER NOT NULL, 
    [Username]     NVARCHAR (50)    NULL, 
    [PasswordHash] CHAR (64)        NOT NULL, 
    [Salt]         CHAR (64)        NOT NULL, 
    [Role]         UNIQUEIDENTIFIER NOT NULL, 
    [Token]        NVARCHAR (50)    NOT NULL, 
    [TokenStamp]   DATETIME         NULL, 
    CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED ([Id] ASC), 
    CONSTRAINT [FK_User_Role] FOREIGN KEY ([Role]) REFERENCES [dbo].[Role] ([Id]) 
); 

角色表:

CREATE TABLE [dbo].[Role]   
( 
    [Id]   UNIQUEIDENTIFIER NOT NULL, 
    [Name] NVARCHAR (50)    NULL, 
    CONSTRAINT [PK_Role] PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

WebService.cs:

using System.Linq; 
using System.Net; 
using System.Web.Services; 
using NHibernate; 
using Models; 
 
[WebService(Namespace = "http://LambdAlarm.com/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
 
public class LambdAlarmWebService : WebService 
{ 
    [WebMethod] 
    public HttpStatusCode Login(string username, string passwordHash) 
    { 
        var factory = SessionFactory.Instance; 
        var session = factory.OpenSession(); 
        var result = session.QueryOver<User>().List<User>(); 
        var user = new User(); 
        var login = result.FirstOrDefault(u => u.Username == username); 
 
        if (user.Username == login.Username) 
        { 
            return HttpStatusCode.OK; 
        } 
 
        return HttpStatusCode.NotFound; 
    } 
} 

用户模型:

using System; 
 
namespace Models 
{ 
    public class User : EntityBase 
    { 
        public virtual string Username { get; set; } 
        public virtual string PasswordHash { get; set; } 
        public virtual string Salt { get; set; } 
        public virtual Role Role { get; set; } 
        public virtual string Token { get; set; } 
        public virtual DateTime TokenStamp { get; set; } 
    } 
} 

角色模型:

namespace Models 
{ 
    public class Role : EntityBase 
    { 
        public virtual string Name { get; set; } 
    } 
} 

EntityBase:(所有模型都继承了一个 Guid 属性的类)

using System; 
 
namespace Models 
{ 
    public class EntityBase 
    { 
        public virtual Guid Id { get; set; } 
    } 
} 

UserMap:(NHibernate 映射)

using FluentNHibernate.Mapping; 
using Models; 
 
namespace NHibernate.Mapping 
{ 
    public class UserMap : ClassMap<User> 
    { 
        public UserMap() 
        { 
            Table("User"); 
            Id(x => x.Id).GeneratedBy.GuidComb(); 
            LazyLoad(); 
            References(x => x.Role).Column("Role"); 
            Map(x => x.Username).Column("Username"); 
            Map(x => x.PasswordHash).Column("PasswordHash").Not.Nullable(); 
            Map(x => x.Salt).Column("Salt").Not.Nullable(); 
            Map(x => x.Token).Column("Token").Not.Nullable(); 
            Map(x => x.TokenStamp).Column("TokenStamp"); 
        } 
    } 
} 

角色映射:

using FluentNHibernate.Mapping; 
using Models; 
 
namespace NHibernate.Mapping 
{ 
    public class RoleMap : ClassMap<Role> 
    { 
        public RoleMap() 
        { 
            Table("Role"); 
            Id(x => x.Id).GeneratedBy.GuidComb(); 
            LazyLoad(); 
            Map(x => x.Name).Column("Name"); 
        } 
    } 
} 

session 工厂:

using FluentNHibernate.Cfg; 
using FluentNHibernate.Cfg.Db; 
using Models; 
using NHibernate.Conventions; 
 
namespace NHibernate 
{ 
    public static class SessionFactory 
    { 
        private static ISessionFactory _sessionFactory; 
 
        public static ISessionFactory Instance 
        { 
            get 
            { 
                if (_sessionFactory == null) 
                { 
                    _sessionFactory = CreateSessionFactory(); 
                } 
 
                return _sessionFactory; 
            } 
        } 
 
        private static ISessionFactory CreateSessionFactory() 
        { 
            return Fluently.Configure() 
                        .Database(MsSqlConfiguration.MsSql2012 
                            .ConnectionString(c => c.FromConnectionStringWithKey("DatabaseConnectionString"))) 
                        .Mappings(m => 
                        { 
                            m.FluentMappings.Conventions.AddFromAssemblyOf<CustomForeignKeyConvention>(); 
                            m.FluentMappings.AddFromAssemblyOf<EntityBase>(); 
                        }) 
                        .BuildSessionFactory(); 
        } 
    } 
} 

约定:

using FluentNHibernate; 
using FluentNHibernate.Conventions; 
 
namespace NHibernate.Conventions 
{ 
    public class CustomForeignKeyConvention : ForeignKeyConvention 
    { 
        protected override string GetKeyName(Member property, System.Type type) 
        { 
            if (property == null) 
            { 
                return type.Name; 
            } 
 
            return property.Name; 
        } 
    } 
} 

差不多就是这样了。如果有人可以提供帮助,将不胜感激...

请您参考如下方法:

User是sql中的保留字。您可以重命名您的表或让 nhibernate 在表名周围使用 ``。我想如果你改变

Table("User");  

到

Table("`User`"); 

它会起作用。