2017-08-24 103 views
1

我有这样使用EF在oracle中获取插入ID的最佳方式是什么?

myEntity.Database.ExecuteSqlCommand("insert into mytable (id, name) values (mytable_SEQ.nextval,'John')") 

mytable_SEQ查询是创建生成MYTABLE

什么是让插入的ID的最佳方式唯一的ID序列?

+0

我不认为这与EF有关。你可以引入** OUT **参数并使用Oracle SQL ['RETURNING'](https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/returninginto_clause.htm)子句 –

+0

@IvanStoev是的,这是一个选项也是如此。而且,您还需要权衡使用存储过程引入的额外复杂性。再加上它可能需要维护的代码,哪些不在C#应用程序的图层中。 – kayess

+1

虽然它不需要是SP。它可能是匿名的PL/SQL块,例如像'ExecuteSqlCommand(“开始插入到...返回ID到p_Id;结束;”,outParameter);' –

回答

1

有没有这样的事情最好的办法。有几种方法可以实现你想要的。基本上首先是执行sequence.CURRVAL来获取序列的当前值。您也可以使用MAX(id)进行查询以获取ID列的最大值。

注意:如果您具有并发性,这两种方法都不安全。另一个线程可能会修改序列或向表中插入新记录。

为了反映您的评论,我知道的唯一事情是在插入行时使用悲观锁定,并在同一事务中选择最大ID。

+0

我打算说同样的事情。没有其他可靠的解决方案? –

+0

在sql server中你可以添加OUPUT INSERTED.ID并获取你的ID,太遗憾了在oracle中没有这样的东西。没有提到添加简单标识列的复杂性。 –

+0

我会采取你的解决方案,因为我的应用程序不会有任何并发​​性,因为我没有太多的客户端,我的应用程序,我有办法检查它是否是正确的记录后,插入.. –

0

我知道这是绝对不正确的方式,这是我怎么没迄今:

int nextid = myEntity.Database.SqlQuery<int>("select mytable_SEQ.nextval from dual").FirstOrDefault(); 

然后

myEntity.Database.ExecuteSqlCommand("insert into mytable (id, name) values ("+nextid+",'John')") 

我知道它可以以某种方式在一个查询完成..

相关问题