C# 尝试插入schema.table.ID时使用ORA-01400

C# 尝试插入schema.table.ID时使用ORA-01400,c#,oracle,entity-framework,ora-01400,C#,Oracle,Entity Framework,Ora 01400,我有一个表,存储被拒绝的合同建议 CREATE TABLE "STATUS_CONTRATO" ( "STC_ID" NUMBER NOT NULL, "CTB_CONTRATO" NUMBER NOT NULL, "STC_DATA" DATE NOT NULL, "STC_OBSERVACAO" VARCHAR2(200) NOT NULL, CONSTRAINT "STATUS_CONTRATO_PK" PRIMARY KEY ( "STC_ID")

我有一个表,存储被拒绝的合同建议

CREATE TABLE "STATUS_CONTRATO" (
  "STC_ID" NUMBER NOT NULL,
  "CTB_CONTRATO" NUMBER NOT NULL,
  "STC_DATA" DATE NOT NULL,
  "STC_OBSERVACAO" VARCHAR2(200) NOT NULL,
  CONSTRAINT "STATUS_CONTRATO_PK" 
    PRIMARY KEY ( "STC_ID") 
    ENABLE 
    VALIDATE,
  CONSTRAINT "FK_CONTRATO" 
    FOREIGN KEY ( "CTB_CONTRATO")
       REFERENCES "CONTRATO" ( CTB_CONTRATO) 
       ON DELETE SET NULL 
    ENABLE 
    VALIDATE)
;
(由Visual Studio 2010生成的脚本)

此表有一个简单的触发器,其中设置了
STC_ID
的值:

TRIGGER "STATUS_CONTRATO_TRIGGER1"
  BEFORE
  INSERT
  ON "STATUS_CONTRATO"
  FOR EACH ROW

when (new.STC_ID = 0)
DECLARE
BEGIN 
  SELECT SEQ_STATUS_ID.NEXTVAL INTO :NEW.STC_ID FROM DUAL;
END;
SEQ_STATUS_ID
是一个简单的序列

我的问题是:

我可以在VS2010查询窗口中成功执行此插入:

insert into myschema.STATUS_CONTRATO s(
  s.STC_ID, s.CTB_CONTRATO, s.STC_DATA, s.STC_OBSERVACAO
)values(
  0, 10, SYSDATE, 'Inserting by hand works'
);
但是,当我尝试使用EF插入时,会出现以下异常:

System.Data.UpdateException: An error occurred while updating the entries. 
See the inner exception for details. ---> Oracle.DataAccess.Client.OracleException: 
ORA-01400: cannot insert NULL into ("MYSCHEMA"."STATUS_CONTRATO"."STC_ID")
ORA-06512: at line 4
我正在使用此代码插入

STATUS_CONTRATO statusContrato = new STATUS_CONTRATO() {
    STC_ID = 0,
    CTB_CONTRATO = codContrato,
    STC_DATA = DateTime.Today,
    STC_OBSERVACAO = observacao
};
ent.STATUS_CONTRATO.AddObject(statusContrato);
ent.SaveChanges();
我使用的是VS2010、Oracle 11g(CentOS服务器)、ODP.NET客户端11.2.0.3.0产品、.NET Framework 4.0、EF 4。

请检查:

特别是“触发器和序列”一节

从“工具”菜单中,选择“运行SQL Plus脚本”。浏览到 在提取代码和脚本的位置,选择 triggers.sql脚本,从列表中选择HR连接,然后单击 跑脚本创建的INSERTEMPLOYEES触发器生成一个新的 每当为该值传入NULL时,员工ID的序列


您的代码可以正常工作,但存在以下问题:

ent.UNV_STATUS_CONTRATO.AddObject(statusContrato);
UNV\u STATUS\u与另一张表相反吗?为什么不呢

ent.STATUS_CONTRATO.AddObject(statusContrato);
那应该行得通

但是,您可能会发现最好从代码中获取序列值,并在保存更改之前将其应用于内存中的ID列。比如说:

    public static int GetSequenceNextVal()
    {
        using (YourEntities entities = new YourEntities ())
        {
            var sql = "select myschema.SEQ_STATUS_ID.NEXTVAL from dual";
            var qry = entities.ExecuteStoreQuery<decimal>(sql);
            return (int)qry.First();
        }
    }
public static int GetSequenceNextVal()
{
使用(YourEntities=newyourEntities())
{
var sql=“选择myschema.SEQ_STATUS_ID.NEXTVAL from dual”;
var qry=实体。ExecuteStoreQuery(sql);
返回(int)qry.First();
}
}
然后在
SaveChanges()
之前调用该方法

就我个人而言,我更喜欢这样处理它,这样我的内存实体也就有了正确的ID,而不是仅仅有一个0,或者必须直接查询它,等等


此外,触发器和序列下描述的方法可能会将实体的PK连接到序列。

您需要在EF映射中指定DB不会为您生成密钥,EF应该使用您提供的密钥

请参阅以下帖子中的我的帖子:

尝试使用System.Data.OracleClient并检查问题是否存在persists@NathanSystem.Data.OracleClient不是EF提供程序。我已更改为
System.Data.OracleClient
,因为它没有正确绑定系统另一部分中的参数
UNV\u
只是我们用于表的前缀。我在问题的其他部分省略了它,但忘了在这里省略。
StoreGeneratedPattern=“Identity”
已在.edmx文件中设置。通过将触发器更改为文章zipfile中提供的触发器,并对
STC_ID=0
语句进行注释来解决此问题