使用实体框架(C#)覆盖PostgreSql中的序列序列

时间:2016-01-31 22:52:19

标签: c# entity-framework postgresql

在PostgreSQL数据库中添加包含Entity Framework的记录时,如何覆盖ID字段中的序列/序列?

串行/序列自动递增ID在添加记录时工作正常,但我需要编写一个迁移脚本,其中我迁移的旧记录必须保留其旧ID。

如果我直接向服务器发送INSERT查询,它可以正常工作,但在使用Entity Framework时,它们只是从1,2,3等开始。

1 个答案:

答案 0 :(得分:0)

在使用自动生成的值进行任何插入之前,您应该重置数据库中的序列。它高度依赖于表DDL。大多数使用ID的autogen有两个例子:

/*
-- Be careful with these 3 lines if you already have such objects in the your DB 
drop table if exists t1;
drop table if exists t2;
drop sequence if exists seq_t2_id;
*/

-- Using serial type for ID
create table t1 (t1_id serial, t1_name char varying);
insert into t1 (t1_id, t1_name) values (22, 'aaa');
select setval(pg_get_serial_sequence('t1', 't1_id'), (select max(t1_id) from t1)); -- Reset serial value
insert into t1 (t1_name) values ('bbb');
select * from t1;

-- Using sequence to generate IDs
create sequence seq_t2_id;
create table t2(t2_id bigint default nextval('seq_t2_id'), t2_name char varying);
insert into t2(t2_id, t2_name) values (22, 'aaa');
select setval('seq_t2_id', (select max(t2_id) from t2)); -- Update sequence
insert into t2 (t2_name) values ('bbb');
select * from t2;