1

对于 ORMLite 中的某些模型,我使用Guidas 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 限制为仅主键?

4

0 回答 0