Asp.net 实体框架-使列自动递增

Asp.net 实体框架-使列自动递增,asp.net,database,oracle,entity-framework,Asp.net,Database,Oracle,Entity Framework,所以我使用实体框架,我们有一个称为TPM_PROJECTVERSIONNOTES的表的模式。此表有一个名为NOTEID的列,它是一个数字。现在,当我们创建新行时,我们将使用以下代码获得下一个可用编号: note.NOTEID = (from n in context.TPM_PROJECTVERSIONNOTES orderby n.NOTEID descending select n.NOTEID).Max() + 1; 对我来说,

所以我使用实体框架,我们有一个称为TPM_PROJECTVERSIONNOTES的表的模式。此表有一个名为NOTEID的列,它是一个数字。现在,当我们创建新行时,我们将使用以下代码获得下一个可用编号:

note.NOTEID = (from n in context.TPM_PROJECTVERSIONNOTES
               orderby n.NOTEID descending
               select n.NOTEID).Max() + 1;
对我来说,这似乎是难以置信的骇客我的意思是你必须做一个完整的SQL查询,只是为了得到下一个值。另外,这是非常危险的;它不是线程安全或事务安全的。我已经在DB中找到了9个具有相同NOTEID的实例!幸好没人想到对那个专栏加上一个独特的限制。。。唉

总之,我在数据库中添加了一个新序列:

CREATE SEQUENCE TPM_PROJECTVERSIONNOTES_SEQ START WITH 732 INCREMENT BY 1;
现在我的问题是:


在将行插入此表时,如何指示实体框架使用TPM_PROJECTVERSIONNOTES_SEQ.nextval?基本上,我根本不想指定NOTEID,我希望框架为我处理它。有人建议我使用触发器,但我认为这有点不妥,我宁愿让实体框架首先创建正确的SQL。我使用Oracle 11g来实现这一点。

虽然这可能仍然属于您所谓的“黑客”类别,但您可以避免使用触发器来调用nextval,但您必须使用存储过程来处理插入,而它将调用nextval而不是使用触发器。我想这可能属于TAPI/XAPI类别

看看最近的文章

它解释并包含使用存储过程处理插入、调用序列并将其映射回ODP EF BETA的示例


这显然没有让ODP EF Beta为nextval编写SQL,但它是一种替代方法。看看这个论坛,似乎大多数EF-Oracle框架都是这个-devart等的牺牲品{https://forums.oracle.com/forums/thread.jspa?threadID=2184372}

可能的重复不是完全重复。这个问题要求一个不使用触发器的解决方案。链接的可能重复项的答案涉及一个触发器。@Shannon:这不是关于问题所问的问题,而是关于什么是可能的,EF只是不做任何事情从序列中获取下一个值,除非这是在Oracle的提供程序中特别编码的,我知道它不是。它希望Id分配在DB=它需要触发器时发生。@Ladislav:我认为问题是否重复取决于所问的内容,而不是可能的内容。据我所知,另一个问答没有明确说明触发是唯一的方式,因此没有回答迈克的问题,未来的人们也会问同样的问题,有没有一种不用触发的方式。所以我认为迈克的问题可能有价值。是的,我在这个问题上做了很多研究。简单的回答是Oracle序列太差劲了——你不能默认它们,触发器会影响性能,实体框架讨厌它们,如果你想批量复制或复制数据,这是一个PITA,列表中还有很多。我现在强烈考虑在适当的情况下切换到UUID作为主键。无论如何,我一直都是MS SQL和Postgres中这种设计的粉丝。