对于 ORMLite 中的某些模型,我使用Guid
as Primary/Foreign Key
- 它允许进行批量插入,而无需在GetLastInsertedId()
插入每条记录后进行。我还将type 用于搜索ShortId
目的int
或传入 URL 参数(如博客文章整数 id),该参数应在每次插入后自动递增。
我不明白如何[AutoIncrement]
处理 PostgreSQL 中的非主键列。我做错了什么?
这是我的班级的一个例子:
[Alias("ProductProperties")]
public class ProductProperty : IHasShortId, IHasName
{
public ProductProperty() { Id = Guid.NewGuid(); }
[PrimaryKey]
public Guid Id { get; set; }
[AutoIncrement]
public int ShortId { get; set; }
public string Name { get; set; }
[ForeignKey(typeof(ProductPropertyType))]
public int PropertyTypeId { get; set; }
}
short_id
它使用as生成创建表脚本integer
,而不是serial
:
CREATE TABLE product_properties
(
id uuid NOT NULL,
short_id integer NOT NULL,
name text,
property_type_id integer NOT NULL,
CONSTRAINT product_properties_pkey PRIMARY KEY (id),
CONSTRAINT "FK_product_properties_product_property_types_PropertyTypeId" FOREIGN KEY (property_type_id)
REFERENCES product_property_types (short_id) MATCH Unknown
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE product_properties
OWNER TO postgres;
更新:
我可以通过修补 ORMLite 源代码来解决这个问题: https ://github.com/ServiceStack/ServiceStack.OrmLite/blob/master/src/ServiceStack.OrmLite/OrmLiteConfigExtensions.cs#L127-L128
评论了这一isPrimaryKey &&
行。
还编辑了 ServiceStack.OrmLite.OrmLiteDialectProviderBase.cs 第 385-403 行
从
if (isPrimaryKey)
{
sql.Append(" PRIMARY KEY");
if (autoIncrement)
{
sql.Append(" ").Append(AutoIncrementDefinition);
}
}
else
{
if (isNullable)
{
sql.Append(" NULL");
}
else
{
sql.Append(" NOT NULL");
}
}
至
if (autoIncrement)
{
sql.Append(" ").Append(AutoIncrementDefinition);
}
if (isPrimaryKey)
{
sql.Append(" PRIMARY KEY");
}
else
{
if (isNullable)
{
sql.Append(" NULL");
}
else
{
sql.Append(" NOT NULL");
}
}
为什么 ORMLite 将 AutoIncrement 限制为仅主键?