FLuent Nhibernate 和 PostgreSQL 中的自动增量

发布于 2024-09-26 15:09:40 字数 440 浏览 2 评论 0原文

我是 Fluent Nhibernate 的新手。

我有一个 PostgreSQL 数据库,我想要的是一个自动递增的生成 ID。 我还没有在 PostgreSQL 中看到自动增量功能,并且我知道要在 PostgreSQL 中使用自动增量,我必须创建一个序列。

除了序列还有其他方法吗?

如果创建序列是唯一的方法,你能告诉我应该如何映射它吗? 我尝试使用它但没有成功:

mapping.Id(x => x.Id, "id").GeneratedBy.Sequence("hibernate-sequence");

我在使用它之前创建了 hibernate-sequence 。

问候

I`m a newbie in Fluent Nhibernate.

I have a PostgreSQL database and what I want is a generated id with auto increment.
I have not seen feature auto increment in PostgreSQL and I understand that to use auto increment in PostgreSQL I have to create a sequence.

Is there another way besides sequences?

If create sequence is the only way, can you tell me how I should mapping it?
I tried to use this and had no success:

mapping.Id(x => x.Id, "id").GeneratedBy.Sequence("hibernate-sequence");

I have created hibernate-sequence before using it.

Regards

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

寒尘 2024-10-03 15:09:40

奇怪,但是如果您调用 Save(Object) 而不是 SaveOrUpdate(Object) ,那么使用您的代码,插入工作正常。

编辑 #1

这对我有用。

实体:

public class Human
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }
}

public class HumanMap : ClassMap<Human>
{
    public HumanMap()
    {
        this.Id(x => x.ID).CustomSqlType("Serial").GeneratedBy.Native();
        this.Map(x => x.Name);
    }
}

以及具有模式导出的配置:

static ISessionFactory CreateSF()
{
    return Fluently
    .Configure()
    .Database(PostgreSQLConfiguration.Standard.ConnectionString("Server=127.0.0.1;Port=5432;Database=fnhtest;User=postgres;Password=password"))
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Program>())
    .ExposeConfiguration(cfg => { new SchemaExport(cfg).Create(false, true); })
    .BuildSessionFactory(); 
}

Strange, but with your code an insertion works fine, if you call Save(Object) instead of SaveOrUpdate(Object)

Edit #1

That's what worked for me.

Entity:

public class Human
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }
}

public class HumanMap : ClassMap<Human>
{
    public HumanMap()
    {
        this.Id(x => x.ID).CustomSqlType("Serial").GeneratedBy.Native();
        this.Map(x => x.Name);
    }
}

And configuration with schema export:

static ISessionFactory CreateSF()
{
    return Fluently
    .Configure()
    .Database(PostgreSQLConfiguration.Standard.ConnectionString("Server=127.0.0.1;Port=5432;Database=fnhtest;User=postgres;Password=password"))
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Program>())
    .ExposeConfiguration(cfg => { new SchemaExport(cfg).Create(false, true); })
    .BuildSessionFactory(); 
}
末骤雨初歇 2024-10-03 15:09:40

我没有在 PostgreSQL 中看到自动增量功能

这就是 Frank 提到的 SERIAL 数据类型。

只需将有问题的列创建为 SERIAL,您就有一个自动增量列:

CREATE TABLE the_table (
  id serial not null primary key,
  other_column varchar(20), 
  ...
);

然后您需要在 Hibernate 中将该列注释为“自动增量”(因为我不使用 Hibernate,所以我无法告诉您具体是如何实现的)已完成)。

I have not seen feature auto increment in PostgreSQL

That's the SERIAL datatype mentioned by Frank.

Just create the colum in question as SERIAL and you have an auto-increment column:

CREATE TABLE the_table (
  id serial not null primary key,
  other_column varchar(20), 
  ...
);

Then you need to annotate that columns as an "auto increment" in Hibernate (as I don't use Hibernate, I can't tell you how exactly that is done).

长伴 2024-10-03 15:09:40

只需使用数据类型SERIAL

Just use the datatype SERIAL.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文