对于ORMLite中的某些模型,我使用Guid
作为Primary/Foreign Key
- 它允许在插入每个记录后执行批量插入而无需执行GetLastInsertedId()
。我还使用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
为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限制为主键?