ORMLite AutoIncrement在PostgreSQL中不起作用

时间:2013-07-21 13:46:07

标签: ormlite-servicestack

对于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_idinteger,而不是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限制为主键?

0 个答案:

没有答案