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();
}
}
我正在尝试使用 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();
}
}