【问题标题】:Entity framework inserting always null ID插入始终为空 ID 的实体框架
【发布时间】:2018-07-03 16:58:18
【问题描述】:

我正在尝试使用实体框架将更改保存到数据库中。

  using (var context = new Entities())
  {
     USERS user = new USERS() { NAME = name, PASSWORD = password };
     context.USERS.Add(user);
     context.SaveChanges();
  }

在插入 0 作为主键时总是抛出异常:

ORA-01400: 无法将 NULL 插入 (\"SYSTEM\".\"USERS\".\"ID\")

ORA-06512:在第 4 行

任何想法为什么会发生这种情况?

编辑:

USERS 类具有以下属性:

    public int ID { get; set; }
    public string NAME { get; set; }
    public string PASSWORD { get; set; }

我在 Identity 上设置了 StoreGeneratedPattern,它仍然将 ID 插入为 0

【问题讨论】:

  • 你能分享你的模型课吗?这通常是因为您没有将 ID 属性注释为 [Key]
  • USERS 类是什么样的?您是否定义了主键?是设置为数字还是 GUID?
  • 看起来users.id 应该是一个标识列。是吗?
  • 顺便说一下,system 是为 Oracle 内部保留的,您不应该将它用于您自己的对象。

标签: c# .net oracle frameworks entity


【解决方案1】:

你需要创建一个序列:

CREATE SEQUENCE "DatabaseName".SEQ_user_ID  MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 18000 CACHE 2 NOORDER  NOCYCLE  NOKEEP  NOSCALE  GLOBAL ;

还有一个触发器:

CREATE OR REPLACE TRIGGER "DatabaseName".TRI_SEQ_user_ID
               BEFORE INSERT ON version
               REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
BEGIN
  SELECT ID.nextval INTO :NEW.ID FROM DUAL;
END;

通过这两个函数,您可以在不指定 ID 的情况下将新条目添加到数据库中

【讨论】:

    【解决方案2】:

    如果您不首先使用代码或不首先使用数据库,oracle 就不要创建序列 你试试用序列触发

           CREATE OR REPLACE TRIGGER 
    "a"."IHALEYOL"
    before insert on "a"."IHALEYOL"
    for each row
    begin
      select "a"."SQ_DIREK".nextval into :new."ID" from dual;
    end;
    

    序列:

     create sequence SQ_YETKI
    minvalue 1
    maxvalue 9999999999999999999999999999
    start with 221
    increment by 1
    cache 20;
    

    【讨论】:

      【解决方案3】:

      尝试从 DB 生成模型作为 Code-Frist,仍然插入 0 作为 ID。这里是主键配置:

       modelBuilder.Entity<USERS>()
                      .HasKey<int>(e => e.ID);
      

      和实体属性:

          [Key]
          public int ID { get; set; }
      
          [Required]
          [StringLength(50)]
          public string NAME { get; set; }
      
          [Required]
          [StringLength(50)]
          public string PASSWORD { get; set; }
      

      【讨论】:

        【解决方案4】:

        我能够通过将所有系统权限(SYSDBA 和 SYSOPER 除外)授予连接字符串用户来解决此问题:

        我猜你可能错过了使用该序列的权限,但我不确定到底是哪一个。

        【讨论】:

          猜你喜欢
          • 2018-02-02
          • 2021-05-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-19
          • 2011-12-17
          相关资源
          最近更新 更多