7

我有一个 web api post 方法,可以在我的 Oracle 数据库的表中插入一个新行。我在使用作为序列值的表的主键时遇到问题。my_primary_key_seq.nextval在实体框架中我该怎么做?目前,此代码有效,但当通过我们使用序列下一个值作为下一个主键的旧 .net 网络表单插入新行时,它将违反 PK 唯一约束。

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

2 回答 2

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 模型,它也应该会持续存在。
于 2014-12-03T15:46:17.090 回答
4

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

IE

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

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

于 2018-08-20T02:41:20.357 回答