NHibernate 正在为我生成不正确的独立列

NHibernate is generating me incorrect indetity columns

我正在尝试使用 Fluent NHibernate 生成一些 classes,这样我就可以在 SQLServer 2005 中拥有一个代码优先的数据库,但发生了一些奇怪的事情。我正在映射非身份 PK,但不知何故,NHibernate 将其翻译为身份 PK。

这是我的 class:

    public class Job
{
    public virtual int JobId { get; set; }
    public virtual IList<Persons> People { get; set; }
    public virtual IList<Tool> Tools { get; set; }
}

我的作业映射:

    public class JobMap : ClassMap<Job>
{
    public JobMap()
    {
        Table($"`{nameof(Job)}`");
        Id(j => j.JobId);

        HasMany(x => x.Tools).KeyColumn("JobId")
            .Inverse()
            .Cascade.AllDeleteOrphan();

        HasMany(x => x.People).KeyColumn("JobId")
            .Inverse()
            .Cascade.AllDeleteOrphan();
    }
}

这就是 SchemaExport 抛出的内容:

    create table [Job] (
    JobId INT IDENTITY NOT NULL,
   primary key (JobId)
)

正在创建数据库:

        public void CreateDatabase()
    {
        var connectionString = Configuration.GetSection("JobsConnectionString").Get<string>();
        var configuration = Fluently.Configure()
            .Database(() => FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005.ShowSql().UseReflectionOptimizer().ConnectionString(connectionString))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<JobMap>())
            .BuildConfiguration();

        var exporter = new NHibernate.Tool.hbm2ddl.SchemaExport(configuration);
        exporter.SetOutputFile(@"C:\Users\myself\Desktop\bbb.txt");
        exporter.Execute(true, true, false);

        var _sessionFactory = configuration.BuildSessionFactory();
        var session = _sessionFactory.OpenSession();
        var isOpen = session.IsOpen;
        session.Close();
        _sessionFactory.Close();
    }

我曾尝试删除人员和工具映射以防出现问题,但似乎没有任何影响。如果我用 JobId 保存一个 Job,比方说,“23”,它 returns 使用 Identity 保存的对象,例如“1”。

如果我尝试从生成的 sql 中删除身份信息并在我的数据库中启动创建 table,当我尝试保存它时会给我一个错误,好像是将 JobId 保存为 null(因为引擎认为该字段已生成)。

顺便说一下,我正在使用 FluentNHibernate 3.0 和 .Net Core 3。

这里有什么线索吗?它也发生在创建的其他对象上。

谢谢。

编辑:创建一个新项目并尝试使用仅具有 2 个属性(Id 和名称、整数和字符串)的对象复制相同的东西,最新版本为 Fluent NH (3.1) 并使用SQL Server 2012 提供程序,架构导出一直在做同样的事情。

EDIT2:Fluent Mapping 有一些错误,因为使用 XML 创建地图是可行的。我正在尝试调试它。

最后,(如我所料)什么都没有。问题是默认情况下会生成 Fluent NH 中的 ID,即使您不想生成。但是我们可以更改生成模式,因此我们将其设置为“已分配”以保留传递的值,如 https://nhibernate.info/doc/nh/en/index.html#mapping-declaration-id-assigned

中所述

所以最后,没有 HasMany 声明的第一个映射结束是这样的

public class JobMap : ClassMap<Job>
{
    public JobMap()
    {
        Table($"`{nameof(Job)}`");
        Id(j => j.JobId).GeneratedBy.Assigned();
    }
}