由于主键的约束冲突而无法添加新的用户声明

问题描述 投票:0回答:1

我有一个使用Oracle数据库的网络核心Web应用程序网络核心3.1。这些表是使用MS.EntityFrameworkCore.Tools(“ add-migration”和“ update-database”命令)生成的。自动生成的表,特别是AspNetUserClaims和AspNetRoleClaims都使用Oracle的自动标识生成。

我遇到的问题是给定的代码,由于约束冲突,我无法添加新的用户声明。

OracleException:ORA-00001:违反了唯一约束(SYSTEM.PK_AspNetUserClaims)。

表的SQL:

CREATE TABLE "SYSTEM"."AspNetUserClaims" 
(   
    "Id" NUMBER(10,0) GENERATED BY DEFAULT AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  NOT NULL ENABLE, 
    "UserId" NVARCHAR2(450) NOT NULL ENABLE, 
    "ClaimType" NVARCHAR2(2000), 
    "ClaimValue" VARCHAR2(3000 CHAR), 
     CONSTRAINT "PK_AspNetUserClaims" PRIMARY KEY ("Id")
     ......
)

C#代码:

IdentityUserClaim<string> userClaim = new IdentityUserClaim<string> { UserId = user.Id, ClaimType = "WT", ClaimValue = JsonConvert.SerializeObject(jsonWebToken) };
//// var last = await _context.UserClaims.LastOrDefaultAsync(); // dumb workaround
//// userClaim.Id = last == null ? 1 : last.Id + 1;
await _context.UserClaims.AddAsync(userClaim);
  1. GENERATED ALWAYS,尝试插入一个值将导致错误,但是id是一个默认值为0的整数。

  2. GENERATED DEFAULT,如果不提供任何值,则生成,与上面相同,默认为0。

  3. 默认为NULL生成,整数不可为空。

如何从这里开始创建用户声明?

请忽略混合大小写,系统架构,引号或其他内容。

c# oracle constraints add
1个回答
0
投票

默认情况下生成,同时手动提供其值:

SQL> create table test(id number generated by default as identity primary key, name varchar2(10));

Table created.

SQL> insert into test (id, name) values (1, 'Little');

1 row created.

SQL> insert into test (id, name) values (1, 'Foot');
insert into test (id, name) values (1, 'Foot')
*
ERROR at line 1:
ORA-00001: unique constraint (DP_4005.SYS_C001685565) violated

如果省略ID:

SQL> insert into test (name) values ('Foot');
insert into test (name) values ('Foot')
*
ERROR at line 1:
ORA-00001: unique constraint (DP_4005.SYS_C001685571) violated

始终生成;手动提供的ID值:

SQL> create table test(id number generated always as identity primary key, name varchar2(10));

Table created.

SQL> insert into test (id, name) values (1, 'Little');
insert into test (id, name) values (1, 'Little')
                  *
ERROR at line 1:
ORA-32795: cannot insert into a generated always identity column

所以-不要提供ID,让Oracle处理它:

SQL> insert into test (name) values ('Little');

1 row created.

SQL> insert into test (name) values ('Foot');

1 row created.

SQL> select * From test;

        ID NAME
---------- ----------
         1 Little
         2 Foot

结论?让数据库处理要生成的列;不要手动提供这些值。


此外,您发布的第一行:

CREATE TABLE "SYSTEM"."AspNetUserClaims" 

您要避免2次“错误”:

  • SYSTEM和SYS是Oracle数据库中的特殊用户,他们拥有它,除维护数据库的DBA以外,应not使用。在任何这些模式中创建自己的对象都是(可能是)巨大的错误。如果做错了,则可能会破坏数据库。
  • 双引号(Caius Jardas已经评论):不要在Oracle中使用它们。您可以使用任何字母大小写,但对象名称将默认为大写。

请参见一些示例:

SQL> create table TesT (nAME varCHAr2(10));

Table created.

SQL> select table_name, column_name from user_tab_columns where table_name = 'TEST';

TABLE_NAME           COLUMN_NAME
-------------------- --------------------
TEST                 NAME

SQL> select NamE from TEst;

no rows selected

但是,如果使用双引号,则每次都必须匹配字母大小写(当然,每次都使用双引号:]

SQL> create table "TesT" ("nAME" varchar2(10));

Table created.

SQL> select table_name, column_name from user_tab_columns where table_name = 'TesT';

TABLE_NAME           COLUMN_NAME
-------------------- --------------------
TesT                 nAME

SQL> select * From test;
select * From test
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> select name from "test";
select name from "test"
                 *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> select name from "TesT";
select name from "TesT"
       *
ERROR at line 1:
ORA-00904: "NAME": invalid identifier


SQL> select "nAME" from "TesT";

no rows selected

SQL>

所以-在Oracle中忘记双引号。

© www.soinside.com 2019 - 2024. All rights reserved.