gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:53 24 4
gpt4 key购买 nike

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

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`");

它会起作用。

关于c# - 使用 NHibernate 的 Web 服务中的 "Could not execute query error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27343586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com