- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
正如标题所说,我收到一条错误消息:“创建 SessionFactory 时使用了无效或不完整的配置。检查 PotentialReasons 集合和 InnerException 以获取更多详细信息。”
我将从代码开始。
数据库:
用户表:
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)
);
用户类别:
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 Guid 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; }
}
}
实体库:
using System;
namespace Models
{
public class EntityBase
{
public virtual Guid Id { get; set; }
}
}
用户 map :
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");
}
}
}
自定义外键约定:
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;
}
}
}
session 工厂:
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
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<Models.EntityBase>();
})
.BuildSessionFactory();
}
}
}
网络服务.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 password)
{
var factory = SessionFactory.Instance;
var session = factory.OpenSession();
var result = session.QueryOver<User>().List<User>();
var login = result.Where(u => u.Username == username).Where(p => p.PasswordHash == password);
return HttpStatusCode.NotFound;
}
}
所以是的...这不是一件容易的事。我认为数据库中的外键关系与用户和角色表有某种关系。角色列应引用角色表中的Id。
请帮忙!
最佳答案
问题是 References()
是用来引用另一个实体,而不是一个类型。如果你想使用一个类型,你应该使用 Map(x => x.Role)
而不是 References(x => x.Role)
将 User
更改为:
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; } //CHANGED HERE
public virtual string Token { get; set; }
public virtual DateTime TokenStamp { get; set; }
}
你的 UserMap
到:
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");
}
此外,当您使用 Fluent NHibernate 进行映射时,没有理由指定您的列名。默认情况下,它只会使用您的属性的名称,所以像 Map(x => x.Name).Column("Name").Not.Nullable()
一样, Map(x => x.Name).Not.Nullable()
其他一些建议:
为您的映射创建一个基类以使其更容易:
public abstract class ClassMapBase<T> : ClassMap<T> where T: EntityBase
{
protected ClassMapBase()
{
Id(x => x.Id).Not.Nullable().GeneratedBy.GuidComb();
LazyLoad();
}
}
此外,令我感到惊讶的是,NHibernate 没有提示您在 EntityBase
上的 Id
具有公共(public) setter 。它应该设置为 protected 或私有(private)。也不需要指定您的表名,除非您希望它与您的实体名称不同
关于c# - "An invalid or incomplete configuration was used while creating a SessionFactory"Web 服务中的 NHibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27273642/
我正在使用 Ubuntu 16.04。 当我更新时,我收到以下消息 $ sudo apt-get update .... E: dpkg was interrupted, you must manua
似乎有些autoconf项目使用configure.in文件生成configure脚本,有些使用configure.ac。 使用一种或另一种之间的区别/优势是什么? 最佳答案 这只是风格问题。历史上
我正在尝试按如下方式配置 logback,但它抛出了这个错误。配置文件如下: %d{ISO8601} %-5p [%c] %msg%n
从Miguel de Icaza: We use a library profile that is better suited for mobile devices, so we removed f
我有两个 .config 文件,我需要一个 System.Configuration.Configuration那是它们之间的部分合并? 我可以将文件读取为 XML 并轻松创建所需的合并,但它是一个字
我似乎无法理解这两个注释。我尝试阅读 javadocs 但仍然无法弄清楚。任何人都可以用简单的代码来解释这两个吗? 非常感谢。 最佳答案 您使用 @Configuration作为配置 Spring b
我正在为一个简单的问题而焦头烂额。我的 .NET Core 3 应用程序中有一些设置,我认为最好将其移至我的 appsettings.json 文件。我按照本指南这样做:https://www.c-s
我正在为一个简单的问题而焦头烂额。我的 .NET Core 3 应用程序中有一些设置,我认为最好将其移至我的 appsettings.json 文件。我按照本指南这样做:https://www.c-s
我有以下测试方法: [TestMethod] public void TestHarvestMethod() { HarvestTargetTimeRangeUTC time = new Ha
我的以下代码没有产生预期的输出: public static void main(String[] args) throws MalformedURLException { Configura
我知道要从源代码编译和安装某些东西,在 Unix 系统中,涉及的三个步骤是: 1) ./configure 2) make 3) make install 当我检查OpenCV from source
我有以下片段: static void Main(string[] args) { var container = new UnityContainer(); container.Re
我想好像 apache 的 commons-configuration 可能/支持从属性文件中获取属性作为 map 到目前为止,我已经设法使用以下代码片段间接地做到了这一点 Map map = ne
我正在寻找任何技巧来使用 CKEditor 配置中的参数配置我的插件。我必须传递一些只能在显示 View 时传递的参数。 我想要这样的东西(带有 jQuery 适配器的示例): jQuery('t
在我正在玩的代码中,我看到一些地方是 @Configuration 类除了定义静态类之外什么都不做。格式各不相同,但通常是这样的: @Configuration public class someAu
我们在带有 JRE 7 的 Windows 7 中安装了 Cassandra 2.0.6,我们更新了 cassandra.yaml 文件,如下所示: 数据文件目录:D:\cassandra_data\
我在启动类中收到“'Startup.Configuration' 和'Startup.Configuration' 之间的歧义”错误。我不知道我做了什么导致这个问题。我所做的只是创建了一个 DBCon
我已经安装了 Cygwin64,现在我想安装 extundelete . 所以我下载了它,解压了文件,但是当我运行 ./configure 时它说: $ ./configure Configuring
为什么需要做(在容器目录内): # cd /container/directory/ # ./configure 代替: # pwd /external/path # /container/direc
我正在尝试编译qucs-0.0.19但是当我放置./configure时,它给了我以下错误: checking Checking if admsXml is working... no config
我是一名优秀的程序员,十分优秀!