我编写了一个简单的测试程序,它将使用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
编辑:我现在在不同的场景中测试过它:
结果是一样的。在SaveChanged上没有返回DSID
。另一个结果是,如果我写
ctx.Refresh(RefreshMode.ClientWins, log);
一个InvalidOperationException会引发说,现在有一个键为'0'的实体是正确但没有帮助的: - (。
答案 0 :(得分:3)
如果查看.edmx文件,您会看到定义了概念架构和存储架构。如果在设计器中更改StoreGeneratedPattern,它只会在概念架构中更改它,而不会在存储架构中更改,这是非常必要的。
如果您从模型生成数据库,StoreGeneratedPattern在模型优先开发的设计器中,否则它不起作用。因此,您必须在存储架构中手动插入属性。
答案 1 :(得分:0)
经过几次测试后,我再次看了一下我的edml的XML,然后我看到,StoreGeneratedPattern没有到达XML。我不知道发生了什么,因为在我写的第一篇文章中,我检查了XML。我第一次这样做,属性就在那里。但是,对于那些对解决方案感兴趣的人,请查看此处:Solution in other thread