我有一个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();
答案 0 :(得分:5)
我遇到了同样的问题,并在本网站和Oracle的帮助下解决了这个问题。我假设您正在使用Database First,因为您提到另一个遗留应用程序使用相同的数据库。
我必须做的一些事情。就像Daniel Gabriel所提到的那样,如果你允许Oracle管理身份,你不需要调用序列来找出数字,数据库会为你处理它。但要实现这一点有点棘手,因为您可能需要对数据库进行一系列更改。
在标识栏上创建序列(您已经完成此操作)。
创建一个触发器,以便在插入时自动调用序列。 http://www.oracle-base.com/articles/misc/autonumber-and-identity.php
更改您的实体框架模型。我正在使用EF Database First,并发现这篇文章说明我需要更改模型以将表的标识列的属性设置为
StoreGeneratedPattern="Identity"
Oracle entity in VS entity framework doesnt update the primary key in code
答案 1 :(得分:2)
解决这个问题的方法是使用原始SQL查询从序列中选择一个新值。
即
decimal nextPK = context.Database.SqlQuery<decimal>("SELECT my_primary_key_seq.nextval FROM dual").First();
然后将该值分配给新对象,然后再将其添加到上下文中。