3

我编写了一个简单的测试程序,它将使用 DevArt dotConnect for Oracle v. 6.8.0.350 以直接模式访问 Oracle Express 上的默认 HR 模型:

using (var ctx = new HREntities())
{
    var locNew = new LOCATION();
    locNew.CITY = "Magdeburg";
    ctx.LOCATIONs.AddObject(locNew);
    ctx.SaveChanges();
    // will output 0; in database ID is generated
    Console.WriteLine(locNew.LOCATIONID);
}

LOCATION如您所见,我正在向表中插入。这里我添加了一个触发器:

create or replace
trigger TRG_LOCATION_INS  
   before insert on "HR"."LOCATIONS" 
   for each row 
begin  
   if inserting then 
      select LOCATIONS_SEQ.nextval into :NEW."LOCATION_ID" from dual;       
   end if; 
end;

最后一步是StoreGeneratedPattern在我的模型中设置为Identity(是的,我检查了它是否写入 XML)。

如果我运行测试应用程序,则会创建记录并且它有一个有效的新LocationID. 但在 EF 中,新 ID 不会到达。

为什么它不能识别生成的 ID?如果是,那是什么意思:DevArt 博客

编辑:我现在在不同的场景中对其进行了测试:

  1. 直接模式下的 devArt EntityModel
  2. 带有 OracleClient 的 devArt EntityModel
  3. ADO.NET EntityModel 与 OracleClient

结果是一样的。DSID在 SaveChanged 上返回No。作为另一个结果,如果我写

ctx.Refresh(RefreshMode.ClientWins, log);

一个 InvalidOperationException 会引发说,现在有键为“0”的实体是正确的但没有帮助:-(。

4

2 回答 2

3

如果您查看 .edmx 文件,您会看到定义了一个概念架构和一个存储架构。如果在设计器中更改 StoreGeneratedPattern,它只会在概念模式中更改,而不会在存储模式中更改,这确实是必要的。

StoreGeneratedPattern 在设计器中用于模型优先开发,如果您从模型生成数据库,则它没有效果。所以你必须在存储模式中手动插入属性。

于 2012-08-19T08:47:19.057 回答
0

经过几次测试后,我再次查看了我的 edml 的 XML,我看到 StoreGeneratedPattern 没有到达 XML。我不知道发生了什么,因为在我最初写的帖子中,我检查了 XML。我第一次这样做时,属性就在那里。但是,对于那些对解决方案感兴趣的人,请看这里:其他线程中的解决方案

于 2012-08-19T08:46:29.900 回答