StoreGeneratedPattern无法与DevArt实体框架一起使用?

时间:2012-08-17 15:40:26

标签: c# oracle entity-framework devart dotconnect

我编写了一个简单的测试程序,它将使用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 Blog

编辑:我现在在不同的场景中测试过它:

  1. 直接模式下的devArt EntityModel
  2. 使用OracleClient创建实体模型
  3. 使用OracleClient的ADO.NET EntityModel
  4. 结果是一样的。在SaveChanged上没有返回DSID。另一个结果是,如果我写

    ctx.Refresh(RefreshMode.ClientWins, log);
    

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

2 个答案:

答案 0 :(得分:3)

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

如果您从模型生成数据库,StoreGeneratedPattern在模型优先开发的设计器中,否则它不起作用。因此,您必须在存储架构中手动插入属性。

答案 1 :(得分:0)

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