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

iCa*_*arp 7 .net entity-framework sequence oracle11g nextval

我有一个web api post方法,在我的Oracle数据库中的表中插入一个新行.我遇到了表的主键,这是一个序列值.我如何my_primary_key_seq.nextval在Entity Framework中做?目前此代码有效,但当通过旧的.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();
Run Code Online (Sandbox Code Playgroud)

小智 6

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

IE

decimal nextPK = context.Database.SqlQuery<decimal>("SELECT my_primary_key_seq.nextval FROM dual").First();
Run Code Online (Sandbox Code Playgroud)

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


joz*_*olo 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"

VS实体框架中的Oracle实体不会更新代码中的主键

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