2012-08-17 36 views
3

我写了一个简单的测试程序,它会访问默认的HR模式上的Oracle Express在使用DevArt dotConnect用于Oracle V直流模式6.8.0.350:StoreGeneratedPattern不能与DevArt实体框架一起使用?

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; 

最后一个步骤是在我的模型设定StoreGeneratedPatternIdentity(是的,我检查,如果它被写入到XML)。

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

为什么不识别生成的ID?如果有,是什么意思:DevArt Blog

编辑:我在不同情况下测试开始:

  1. devArt EntityModel在直接模式
  2. devArt EntityModel与OracleClient的
  3. ADO.NET EntityModel与OracleClient的

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

ctx.Refresh(RefreshMode.ClientWins, log); 

一个InvalidOperationException将提高的说法,现在有实体键“0”,这是正确的,但没有帮助:-(。

回答

3

如果您查看.edmx文件您会看到定义了概念模式和存储模式。如果您在设计器中更改StoreGeneratedPattern,则只会在概念模式中更改它,但不会在存储架构中进行更改,这非常必要。

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

+0

对不起,我看到你的回答太迟了。谢谢。 – sprinter252 2012-08-19 09:49:23

+0

这已被更正在新版本中,我beleive ..我有一个.EDML虽然和EntityFramework 6 – hanzolo 2014-02-07 00:00:52

0

我拍了几张测试后再看一下我的edml的XML,我发现StoreGeneratedPattern没有到达XML,我不知道发生了什么,因为在我写的第一篇文章中,我检查了XML,第一次做这个,属性就在那里,但是,对于那些对解决方案感兴趣的人,请看这里:Solution in other thread

+1

我看到你自己找到了答案。我最近遇到了同样的问题,所以我几乎肯定是这个问题。 – aKzenT 2012-08-19 08:49:25