1

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);
    }     

ありがとう、ユヴァル

4

1 に答える 1

0

なぜこれが起こるのか分かりました。基本的に、ScemaUpdate は自動 ID シーケンスを作成できますが、シーケンスが DB に存在するかどうかを確認できないため、エラー メッセージを表示して既存のオブジェクトを再作成しようとします。

このコードは、シーケンスをチェックするために NHibernate によって使用されます (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);\
}

ユヴァル。

于 2013-01-31T08:53:04.197 に答える