gpt4 book ai didi

c# - 无法在 FluentNHibernate 下使用自动 ID 更新 PostgreSQL 表

转载 作者:行者123 更新时间:2023-11-29 14:01:27 25 4
gpt4 key购买 nike

当使用 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();

架构更新()

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

谢谢, 尤瓦尔

最佳答案

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

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

尤瓦尔。

关于c# - 无法在 FluentNHibernate 下使用自动 ID 更新 PostgreSQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14435705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com