3
votes

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

3

3 Answers

6
votes

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(); 
}
1
votes

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).

0
votes