无法在FluentNHibernate下使用auto id更新PostgreSQL表

时间:2013-01-21 09:29:08

标签: c# postgresql nhibernate fluent-nhibernate

当使用SchemaUpdate()将具有自动递增id的映射类导出到PostgreSQL服务器时,抛出以下异常: “错误:42P07:关系”seq_wuf“已经存在”。

抛出异常是因为表和序列确实存在于服务器中,但我希望SchemaUpdate()忽略已存在的序列。

映射表

public class CategoryMap : ClassMap<Category>
{
    public static string tableName = "miao";
    public CategoryMap()
    {
        SchemaAction.Export();
        Table(tableName);
        Id(x => x.Id).GeneratedBy.Sequence("SEQ_" + tableName);
        Map(x => x.Name).Column("Category")
                .CustomType("String")
                .Access.Property()
                .Generated.Never()
                //.CustomSqlType("nvarchar(50)")  // <----
                .Not.Nullable()
                .Length(50); ;
        Map(x => x.Description);
    }
}

出口架构:

  FluentConfiguration config = Fluently.Configure();
        config
        .Database(PostgreSQLConfiguration
        .Standard
        .ConnectionString(connStringPosgtgres))
        .Mappings(m => m.FluentMappings.Add(typeof (CategoryMap)))
        .ExposeConfiguration(UpdateSchema)
        .BuildConfiguration();

SchemaUpdate工具()

private static void CreateSchema(Configuration cfg)
    {
        var schemaExport = new SchemaExport(cfg);
        schemaExport.Drop(false, true);
        schemaExport.Create(false, true);
    }     

谢谢,       尤瓦

1 个答案:

答案 0 :(得分:0)

我发现了为什么会这样。 基本上,虽然ScemaUpdate可以创建自动ID序列,但它无法检查数据库中是否存在序列,因此会尝试重新创建提示错误消息的现有对象。

NHibernate使用此代码检查sequance(src:https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Dialect/Schema/AbstractDataBaseSchema.cs)。 我试着玩了一会儿,也无法从它那里找回序列。

public virtual DataTable GetTables(string catalog, string schemaPattern, string 
tableNamePattern, string[] types){
var restrictions = new[] { catalog, schemaPattern, tableNamePattern }; 
return connection.GetSchema("Tables", restrictions);\
}

尤瓦。