DotNetNext / SqlSugar

.Net aot ORM Fastest ORM Simple Easy VB.NET Sqlite orm Oracle ORM Mysql Orm 虚谷数据库 postgresql ORm SqlServer oRm 达梦 ORM 人大金仓 ORM 神通ORM C# ORM , C# ORM .NET ORM NET5 ORM .NET6 ORM ClickHouse orm QuestDb ,TDengine ORM,OceanBase orm,GaussDB orm ,Tidb orm Object/Relational Mapping
https://www.donet5.com/Home/Doc
MIT License
5.31k stars 1.33k forks source link

Insertable 遇到的问题 #1182

Closed idea-zone closed 1 year ago

idea-zone commented 1 year ago

初始化数据库后,第一次添加数据会提示 “重复键违反唯一约束”,什么都不做,再次添加这个记录,就正常了。每个表的第一次添加数据,都会提示失败。继续添加就没问题。

数据库:Posrgresql 12 引用包: SqlSugarCoreNoDrice: 5.1.4.98 Npgsql 6.0.4

NET 5 WebApi

插入实体的方法


        /// <summary>
        /// 插入实体
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public int Add(T t, bool ignoreNull = true)
        {
            return Context.Insertable(t).IgnoreColumns(ignoreNullColumn: ignoreNull).ExecuteCommand();
        }

程序输入日志

08-16 10:54:58 | 127.0.0.1 | http://localhost/system/dept
执行SQL出错:23505: 重复键违反唯一约束"_copy_17"

DETAIL: Detail redacted as it may contain sensitive data. Specify 'Include Error Detail' in the connection string to include this information.,   at Npgsql.Internal.NpgsqlConnector.<ReadMessage>g__ReadMessageLong|211_0(NpgsqlConnector connector, Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage)
   at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken)
   at Npgsql.NpgsqlDataReader.NextResult()
   at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteNonQuery(Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteNonQuery()
   at SqlSugar.AdoProvider.ExecuteCommand(String sql, SugarParameter[] parameters)
08-16 10:55:03 | http://localhost/system/dept
 23505: 重复键违反唯一约束"_copy_17"

DETAIL: Detail redacted as it may contain sensitive data. Specify 'Include Error Detail' in the connection string to include this information.
08-16 10:55:05 | 127.0.0.1 | http://localhost/system/dept
【db0 SQL语句】SELECT "deptid","parentid","ancestors","deptname","ordernum","leader","phone","email","status","delflag","create_by","create_time","update_by","update_time","remark" FROM "sys_dept"   WHERE (( "deptname" = N'test1' ) AND ( "parentid" = 200 ))   LIMIT 1 offset 0

08-16 10:55:05 | 127.0.0.1 | http://localhost/system/dept
【db0 SQL语句】SELECT "deptid","parentid","ancestors","deptname","ordernum","leader","phone","email","status","delflag","create_by","create_time","update_by","update_time","remark" FROM "sys_dept"   WHERE ( "deptid" = 200 )   LIMIT 1 offset 0

08-16 10:55:05 | http://localhost/system/dept 08-16 10:55:05 | 127.0.0.1 | http://localhost/system/dept

【db0 SQL语句】INSERT INTO "sys_dept"
           ("parentid","ancestors","deptname","ordernum","status","create_by","create_time")
     VALUES
           (200,N'0,200',N'test1',99,N'0',N'admin','2023-08-16 10:55:05.635') ;

创建表的结构


-- Table: public.sys_dept

DROP TABLE IF EXISTS public.sys_dept;
CREATE TABLE IF NOT EXISTS public.sys_dept
(
    deptid bigserial NOT NULL,
    parentid bigint,
    ancestors character varying(50) COLLATE pg_catalog."default",
    deptname character varying(30) COLLATE pg_catalog."default",
    ordernum integer,
    leader character varying(20) COLLATE pg_catalog."default",
    phone character varying(11) COLLATE pg_catalog."default",
    email character varying(50) COLLATE pg_catalog."default",
    status character(1) COLLATE pg_catalog."default",
    delflag character(1) COLLATE pg_catalog."default" DEFAULT 0,
    create_by character varying(64) COLLATE pg_catalog."default",
    create_time timestamp(6) without time zone,
    update_by character varying(64) COLLATE pg_catalog."default",
    update_time timestamp(6) without time zone,
    remark character varying(255) COLLATE pg_catalog."default",
    CONSTRAINT _copy_17 PRIMARY KEY (deptid)
)

TABLESPACE pg_default;

ALTER TABLE IF EXISTS public.sys_dept
    OWNER to postgres;

COMMENT ON TABLE public.sys_dept
    IS '部门表';

COMMENT ON COLUMN public.sys_dept.deptid
    IS '部门id';

COMMENT ON COLUMN public.sys_dept.parentid
    IS '父部门id';

COMMENT ON COLUMN public.sys_dept.ancestors
    IS '祖级列表';

COMMENT ON COLUMN public.sys_dept.deptname
    IS '部门名称';

COMMENT ON COLUMN public.sys_dept.ordernum
    IS '显示顺序';

COMMENT ON COLUMN public.sys_dept.leader
    IS '负责人';

COMMENT ON COLUMN public.sys_dept.phone
    IS '联系电话';

COMMENT ON COLUMN public.sys_dept.email
    IS '邮箱';

COMMENT ON COLUMN public.sys_dept.status
    IS '部门状态(0正常 1停用)';

COMMENT ON COLUMN public.sys_dept.delflag
    IS '删除标志(0代表存在 2代表删除)';

COMMENT ON COLUMN public.sys_dept.create_by
    IS '创建者';

COMMENT ON COLUMN public.sys_dept.create_time
    IS '创建时间';

COMMENT ON COLUMN public.sys_dept.update_by
    IS '更新者';

COMMENT ON COLUMN public.sys_dept.update_time
    IS '更新时间';

COMMENT ON COLUMN public.sys_dept.remark
    IS '备注';

-- ----------------------------
-- Records of sys_dept
-- ----------------------------
INSERT INTO "public"."sys_dept" VALUES (100, 0, '0', 'A公司', 0, 'zr', '', '', '0', '0', 'admin', NULL, '', NULL, NULL);
INSERT INTO "public"."sys_dept" VALUES (101, 100, '0,100', '研发部门', 1, 'zr', '', '', '0', '0', 'admin', NULL, '', NULL, NULL);
INSERT INTO "public"."sys_dept" VALUES (102, 100, '0,100', '市场部门', 2, 'zr', '', '', '0', '0', 'admin', NULL, '', NULL, NULL);
INSERT INTO "public"."sys_dept" VALUES (103, 100, '0,100', '测试部门', 3, 'zr', '', '', '0', '0', 'admin', NULL, '', NULL, NULL);
INSERT INTO "public"."sys_dept" VALUES (104, 100, '0,100', '财务部门', 4, 'zr', '', '', '0', '0', 'admin', NULL, '', NULL, NULL);
INSERT INTO "public"."sys_dept" VALUES (200, 0, '0', 'B公司', 0, 'zr', '', '', '0', '0', 'admin', NULL, '', NULL, NULL);

-- ----------------------------
-- 修改自增序列
-- ----------------------------
SELECT setval('"public"."sys_dept_deptid_seq"', 200, false);    
DotNetNext commented 1 year ago

ORM的SQL对的

INSERT INTO "sys_dept"
           ("parentid","ancestors","deptname","ordernum","status","create_by","create_time")
     VALUES
           (200,N'0,200',N'test1',99,N'0',N'admin','2023-08-16 10:55:05.635') ;

如果sql对的就和ORM没有关系了

DotNetNext commented 1 year ago

SELECT setval('"public"."sys_dept_deptid_seq"', 200, false); 这个200是不是要改成201