C# 将实体保存到oracle后,主键未首先由实体框架6模型填充

C# 将实体保存到oracle后,主键未首先由实体框架6模型填充,c#,oracle,entity-framework,oracle11g,entity-framework-6,C#,Oracle,Entity Framework,Oracle11g,Entity Framework 6,我可以使用EF 6.1.3将实体保存到Oracle 11g。但对象中的标识自动插入字段未更新 据我所知,在调用SaveChanges之后,应该更新对象以包含新的任务id。为什么它不工作 var task = new TASK { API_EXE_MAPPING_ID = mapping.MAPPING_ID, STATUS = "Creating", TASK_SYS_GUID = Guid.NewGuid() }; _taskEntities.TASKS.Add(ta

我可以使用EF 6.1.3将实体保存到Oracle 11g。但对象中的标识自动插入字段未更新

据我所知,在调用SaveChanges之后,应该更新对象以包含新的任务id。为什么它不工作

var task = new TASK
{
    API_EXE_MAPPING_ID = mapping.MAPPING_ID,
    STATUS = "Creating",
    TASK_SYS_GUID = Guid.NewGuid()
};

_taskEntities.TASKS.Add(task);
_taskEntities.SaveChanges();
调试时,紧跟在上行之后的task.task_id的值始终为0

表定义为:

ALTER TABLE TC_QUEUE.TASKS
 DROP PRIMARY KEY CASCADE;

DROP TABLE TC_QUEUE.TASKS CASCADE CONSTRAINTS;

CREATE TABLE TC_QUEUE.TASKS
(
  TASK_ID             NUMBER(10)                NOT NULL,
  TASK_SYS_GUID       RAW(16)                   NOT NULL,
  API_EXE_MAPPING_ID  NUMBER(38)                NOT NULL,
  STATUS              VARCHAR2(20 BYTE)         NOT NULL,
  START_DATETIME      DATE,
  END_DATETIME        DATE
)
TABLESPACE TS_DATA
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
LOGGING 
NOCOMPRESS 
NOCACHE
MONITORING;


CREATE UNIQUE INDEX TC_QUEUE.TASK_PK ON TC_QUEUE.TASKS
(TASK_ID)
LOGGING
TABLESPACE TS_DATA
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           );

CREATE OR REPLACE TRIGGER TC_QUEUE.TASKS_AUTO_INSERT
   BEFORE INSERT
   ON TC_QUEUE.tasks
   FOR EACH ROW
BEGIN
   SELECT TC_QUEUE.tasks_seq.NEXTVAL
     INTO :new.task_id
     FROM DUAL;
END;
/


ALTER TABLE TC_QUEUE.TASKS ADD (
  CONSTRAINT TASK_PK
  PRIMARY KEY
  (TASK_ID)
  USING INDEX TC_QUEUE.TASK_PK
  ENABLE VALIDATE);

ALTER TABLE TC_QUEUE.TASKS ADD (
  CONSTRAINT TASK_MAPPINGS_FK 
  FOREIGN KEY (TASK_ID) 
  REFERENCES TC_QUEUE.API_EXE_MAPPINGS (MAPPING_ID)
  ENABLE VALIDATE);
以下是EDMX:

<EntityType Name="TASK">
  <Key>
    <PropertyRef Name="TASK_ID" />
  </Key>
  <Property Name="TASK_ID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
  <Property Name="TASK_SYS_GUID" Type="Guid" Nullable="false" />
  <Property Name="API_EXE_MAPPING_ID" Type="Int32" Nullable="false" />
  <Property Name="STATUS" Type="String" Nullable="false" MaxLength="20" FixedLength="false" Unicode="false" />
  <Property Name="START_DATETIME" Type="DateTime" />
  <Property Name="END_DATETIME" Type="DateTime" />
  <NavigationProperty Name="API_EXE_MAPPINGS" Relationship="Model.TASK_MAPPINGS_FK" FromRole="TASK" ToRole="API_EXE_MAPPING" />
</EntityType>

我在SO上找到了类似的帖子,但运气不好。

我在表定义中有几个bug,它们以这种奇怪的方式表现出来。解决bug和更新实体解决了问题

首先,外键应该映射的是任务id,而不是任务id

ALTER TABLE TC_QUEUE.TASKS ADD (
CONSTRAINT TASK_MAPPINGS_FK 
FOREIGN KEY (MAPPING_ID) 
REFERENCES TC_QUEUE.API_EXE_MAPPINGS (MAPPING_ID)
ENABLE VALIDATE);
其次,映射上的数据类型不完全匹配。一个精度为10,另一个为38


非常奇怪的行为…

任务系统GUID的类型是什么
Guid.NewGuid()
生成类似7c9e6679-7425-40de-944b-e07fc1f90ae7的字符串,该字符串不转换为
number(10)
或'int`TASK\u ID是问题所在-您应该能够忽略TASK\u SYS\u Guid。TASK_ID是映射到int的数字(10)。TASK_SYS_GUID是原始的(16),它在TASK_ID中对guidUse[Key]进行注释,直到零@EmdadulSawon
ALTER TABLE TC_QUEUE.TASKS ADD (
CONSTRAINT TASK_MAPPINGS_FK 
FOREIGN KEY (MAPPING_ID) 
REFERENCES TC_QUEUE.API_EXE_MAPPINGS (MAPPING_ID)
ENABLE VALIDATE);