我们正在使用带有Entitiy Framework的用于Oracle的Devart dotConnect。
我们一直使用描述为here的解决方案来生成具有序列的ID,并且都运行良好,直到我们升级到devart 9.7为止
看起来好像DefaultValue被忽略了。例如,如果我查看DBMonitor,则会看到不带seq_name.nextval的插入命令。
奇怪的是,当我在控制台应用程序中运行相同的代码时,它可以工作,但在IIS上不行(即使在同一台机器上)
编辑:例如:
在Oracle数据库中有一个表MY_TABLE和一个序列MY_SEQUENCE。
[我使用Devart Entity Developer生成了一个edml模型,其中包含该表的一个实体,称为TABLE。
[在XML编辑器中,我添加了DefaultValue和StoreGeneratedPattern属性。它看起来像这样:
<EntityType Name="MY_TABLE">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="ID" Type="decimal" Nullable="false"
devart:DefaultValue="MY_SEQUENCE.nextval"
StoreGeneratedPattern="Identity" />
<Property Name="COL1" Type="VARCHAR2" MaxLength="200" />
<Property Name="COL2" Type="decimal" Nullable="false" />
</EntityType>
在我的C#代码中,它看起来像这样:
ctx.TABLEs.AddObject(new TABLE(){COL1 = "a", COL2 = 3});
ctx.SaveChanges();
当我在控制台应用程序中执行代码时,生成的命令是:
DECLARE
updatedRowid ROWID;
BEGIN
INSERT INTO MY_TABLE(ID, COL1, COL2)
VALUES (MY_SEQUENCES.nextval, :p0, :p1)
RETURNING ROWID INTO updatedRowid;
OPEN :outParameter FOR SELECT ID FROM MY_TABLE WHERE ROWID = updatedRowid;
END;
但是,IIS(在同一台计算机上)的相同代码生成此命令:
DECLARE
updatedRowid ROWID;
BEGIN
INSERT INTO MY_TABLE(COL1, COL2)
VALUES (:p0, :p1)
RETURNING ROWID INTO updatedRowid;
OPEN :outParameter FOR SELECT ID FROM MY_TABLE WHERE ROWID = updatedRowid;
END;
在旧的Devart版本(9.7之前的版本中,效果很好。
可能是什么原因?
[移至Entity Framework版本5,并用Devart.Data.Oracle.Entity.EF5替换dll-Devart.Data.Oracle.Entity.EF4之后,它又开始工作。