Fluent NHibernate使用我的用户名作为前缀创建表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fluent NHibernate使用我的用户名作为前缀创建表相关的知识,希望对你有一定的参考价值。

我是nhibernet的新手,并试图创建一个测试程序。所以我为Fluent NHibernate创建了实体和映射文件,如下所述:https://github.com/FluentNHibernate/fluent-nhibernate/wiki/Getting-started

实体:

namespace NHibernateDemoApp
{
    public class Employee
    {
        public virtual int Id { get; protected set; }
        public virtual string FirstName { get; set; }
        public virtual string LastName { get; set; }
    }
}

地图:

class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Id(x => x.Id);
        Map(x => x.FirstName);
        Map(x => x.LastName);
    }
}   

然后我像这样使用它们:

private static ISessionFactory CreateFluidSessionFactory()
{
    return Fluently.Configure()
      .Database(MsSqlConfiguration.MsSql2012.ConnectionString("Data Source=mydatabase;Initial Catalog=mydatabase;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False")
      )
      .Mappings(m =>
        m.FluentMappings.AddFromAssemblyOf<Program>())
       .ExposeConfiguration(BuildSchema)
      .BuildSessionFactory();
}

private static void BuildSchema(Configuration config)
{
    new SchemaExport(config)
      .Create(false, true);
}

一切看起来都不错,但NHibernet创建了以我的用户名作为前缀的表。所以表创建看起来像这样:

CREATE TABLE [MyDomainMyUsername].[Employee](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [nvarchar](255) NULL,
    [LastName] [nvarchar](255) NULL,
PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

但它应该像这样创建:

CREATE TABLE [MyDatabase].[Employee](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [nvarchar](255) NULL,
    [LastName] [nvarchar](255) NULL,
PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

当我以另一个用户启动我的测试程序时,表创建两次(每个用户一个)。

我做错了什么?如何告诉hibernate表创建中应该没有用户名。

答案

您需要更改默认架构。这是NH配置设置。确保您具有在dbo架构中创建表的数据库权限。

你应该可以这样做:

return 
    Fluently.Configure()
        .Database(
            MsSqlConfiguration.MsSql2012
                .ConnectionString("Data Source=mydatabase;Initial Catalog=mydatabase;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFai9lover=False")
                .DefaultSchema("dbo"))
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Program>())
        .ExposeConfiguration(BuildSchema)
        .BuildSessionFactory();

该选项会挂起配置类型:https://github.com/FluentNHibernate/fluent-nhibernate/wiki/Database-configuration

以上是关于Fluent NHibernate使用我的用户名作为前缀创建表的主要内容,如果未能解决你的问题,请参考以下文章

Fluent 映射和 NHibernate Xml 配置

使用 Fluent NHibernate 和 NHibernate 3 将枚举映射为 Int

使用 Fluent NHibernate 映射泛型类

Fluent NHibernate 忽略 ClassMap 中的属性,使用 FluentMappings

Fluent Nhibernate 映射多重连接

使用 2 种策略通过 fluent nhibernate 映射类层次结构