如何在.NET Entity Framework中获取Oracle下一个序列值?

时间:2013-08-15 19:38:52

标签: .net entity-framework oracle11g sequence nextval

我有一个web api post方法,在我的Oracle数据库的表中插入一个新行。我遇到了表的主键,这是一个序列值。如何在实体框架中执行my_primary_key_seq.nextval?目前此代码有效,但当通过旧的.net webform插入新行时,它将违反PK唯一约束,该webform使用序列下一个值作为下一个主键。

decimal nextPK = context.FORMPPs.OrderByDescending(p => p.PPID).FirstOrDefault().PPID + 1;
item.PPID = nextPK;
context.FORMPPs.Add(item);
int result = context.SaveChanges();

2 个答案:

答案 0 :(得分:5)

我遇到了同样的问题,并在本网站和Oracle的帮助下解决了这个问题。我假设您正在使用Database First,因为您提到另一个遗留应用程序使用相同的数据库。

我必须做的一些事情。就像Daniel Gabriel所提到的那样,如果你允许Oracle管理身份,你不需要调用序列来找出数字,数据库会为你处理它。但要实现这一点有点棘手,因为您可能需要对数据库进行一系列更改。

  1. 在标识栏上创建序列(您已经完成此操作)。

  2. 创建一个触发器,以便在插入时自动调用序列。 http://www.oracle-base.com/articles/misc/autonumber-and-identity.php

  3. 更改您的实体框架模型。我正在使用EF Database First,并发现这篇文章说明我需要更改模型以将表的标识列的属性设置为

    StoreGeneratedPattern="Identity"

  4. Oracle entity in VS entity framework doesnt update the primary key in code

    1. 但我不喜欢每次从数据库刷新我的EF模型时都必须重新添加此更改的事实。双击.edmx文件,然后在数据库图中找到您的表,突出显示图中的标识列,并在属性窗口中,将StoreGeneratedPattern值更改为Identity。即使您更新EF模型,这应该会持续存在。

答案 1 :(得分:2)

解决这个问题的方法是使用原始SQL查询从序列中选择一个新值。

decimal nextPK = context.Database.SqlQuery<decimal>("SELECT my_primary_key_seq.nextval FROM dual").First();

然后将该值分配给新对象,然后再将其添加到上下文中。