C# 将实体保存到oracle后,主键未首先由实体框架6模型填充
我可以使用EF 6.1.3将实体保存到Oracle 11g。但对象中的标识自动插入字段未更新 据我所知,在调用SaveChanges之后,应该更新对象以包含新的任务id。为什么它不工作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
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);