【问题标题】:NHibernate Manually set id for auto incrementNHibernate 为自动增量手动设置 id
【发布时间】:2015-12-22 12:52:56
【问题描述】:

我正在使用NHibernateMYSQL 进行代码映射,并且映射如下:-

Id(x => x.Id, map => { map.Column("ID"); map.Generator(Generators.Native); });

和数据库如下:-

ID int not null AUTO_INCREMENT

我使用了Generators.Native,因为数据库将通过AUTO_INCREMENT 生成它的ID。但在某些情况下,我想手动设置 id (Id=10)。我如何更改映射,如果 Id=0 则使用“AUTO_INCREMENT”,否则使用已设置的 Id,即 10。

我在互联网上查了一下,得到了这个 link(自定义 ID 生成器),但它是用于 Java + Hibernate。我不知道如何将这个 inNHibernate mapping by code 转换为 C#

【问题讨论】:

  • 为什么要手动设置id“在某些情况下”的值?这些是什么情况?您正在破坏身份列的目的,并且很可能会引入问题,如果不是立即出现,可能会在数月或数年内使自己为人所知。如果通过删除记录创建的 ID 中存在“空白”,您的程序不应该受到影响,我猜这是您正在尝试解决的问题。
  • 如果数据是由前端创建的,那么我们将使用自动增量,并且在运行时我们的系统正在从一些服务中获取数据,这些服务具有一些需要与我们的数据库匹配的 id。可以肯定的是,我们的数据库不会有这个 id,所以我们可以安全地设置 id 及其所需的值。
  • 你如履薄冰。假设这个生成的 ID 已经存在?创建一个单独的列来存储这个值。
  • 在插入之前我检查这个ID是否存在,如果存在则更新否则插入。

标签: c# mysql hibernate nhibernate fluent-nhibernate


【解决方案1】:

在 Hiberante 中,您可以使用使用的注释进行定义。例如你可以定义这个

@GeneratedValue(strategy=GenerationType.IDENTITY)

Identity 属性从数据库中自动递增。

【讨论】:

    【解决方案2】:

    您需要将您的 Id 定义从 Native 更改为 Assigned。

    Id(x => x.Id, map => { map.Column("ID"); map.Generator(Generators.Assigned); });

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      相关资源
      最近更新 更多