1

我目前在 MVC3 应用程序中使用实体框架来连接到 Oracle 数据库。我想将一条新记录写入 Oracle 数据库中的一个表,其中包含一个定义它的主键的序列。当然,主键被定义为不为空。我所有的观点都是用 ASP.Net 而不是 Razor 编写的。

我看到那里的大多数帖子都建议直接在 edmx 模型上设置 StoreGeneratedPattern。但是,我注意到大多数 edmx 模型示例都像这样:VS 实体框架中的 Oracle 实体不更新代码中的主键 包括使用 EntityTypes 定义的表 - 我要执行此操作的相关表实际上包含在 EntitySet 中:

<EntitySet Name="REGISTERED_PERSON" EntityType="Model.Store.REGISTERED_PERSON" store:Type="Tables" Schema="MYSCHEMA" />

当我尝试在此设置 StoreGeneratedPattern=Identity 时,我收到一个错误,即不允许使用 StoreGeneratedPattern 属性,可能是因为它不是 EntityType。我原本想着只是获得最大值。register_person_id 通过 LINQ 语句从数据库中获取,然后将其分配到模型中,但随之而来的问题是,如果同时执行两个插入操作,您将获得重复的 ID。

我还检查了数据库,没有编写任何触发器。我知道在 Oracle 中,您可以选择从 dual 中选择以获取序列生成的下一个值,如下图所示:
select MY_SEQ.nextval,'some value' from dual

这篇文章在这里:关于序列的 postgresql nextval question有一个很好的标题,但问题是我没有使用 postgresql 或 PHP,所以很遗憾它对我没有帮助。我也没有编写任何触发器来在插入记录时触发序列。

如何从序列中获取下一个值并将其分配给我的 Registered_Person_Id,最好是在整个模型对象被传递回控制器以插入数据库之前的视图中?

4

1 回答 1

3

我发现您确实需要触发器和序列才能在 Oracle 中完成这项工作。这是我在生产中使用的触发模式:

CREATE OR REPLACE TRIGGER MYSCHEMA.TRIGGER_NAME 
BEFORE INSERT ON MYSCHEMA.REGISTERED_PERSON
FOR EACH ROW
WHEN ( NEW.REGISTERED_PERSON_ID IS NULL )
BEGIN
  SELECT MY_SEQUENCE.NEXTVAL INTO :NEW.REGISTERED_PERSON_ID FROM dual;
END;
于 2012-10-26T02:52:43.143 回答