C# 使用EF在oracle中获取插入ID的最佳方法是什么?

C# 使用EF在oracle中获取插入ID的最佳方法是什么?,c#,oracle,entity-framework,sequence,C#,Oracle,Entity Framework,Sequence,我有一个这样的问题 myEntity.Database.ExecuteSqlCommand("insert into mytable (id, name) values (mytable_SEQ.nextval,'John')") mytable_SEQ是为生成mytable的唯一ID而创建的序列 获取插入ID的最佳方式是什么?没有最佳方式。有两种方法可以实现你想要的。基本上第一步是执行以获取序列的当前值。您还可以使用MAX(id)进行查询,以获取id列的最大值 注意:如果您有并发性,这两种方

我有一个这样的问题

myEntity.Database.ExecuteSqlCommand("insert into mytable (id, name) values (mytable_SEQ.nextval,'John')")
mytable_SEQ是为生成mytable的唯一ID而创建的序列

获取插入ID的最佳方式是什么?

没有最佳方式。有两种方法可以实现你想要的。基本上第一步是执行以获取序列的当前值。您还可以使用
MAX(id)
进行查询,以获取id列的最大值

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


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

我知道这绝对不是正确的方法,到目前为止我是这样做的:

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

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

关于并发性,我也要说同样的话。没有其他可靠的解决方案?在sql server中,您可以添加OUPUT INSERTED.ID并获取您的ID,可惜oracle中没有这样的解决方案。没有提到添加简单标识列的复杂性。我接受你的解决方案,因为我的应用程序不会有任何并发性,因为我的应用程序没有太多的客户端,而且我有办法在插入后检查它是否是正确的记录。。“在sql server中,您可以添加OUPUT INSERTED.ID并获取您的ID,可惜oracle中没有这样的东西。“Oracle中有这样一个东西。
将id返回到
语法中,但你不喜欢@ivanstoev的建议。所以真的不确定你想要什么。我认为这与EF无关。你可以引入OUT参数并使用Oracle SQL子句,但它不需要是SP。它可以是匿名PL/SQL块,例如something类似于
ExecuteSqlCommand(“开始插入到…将id返回到p_id中;结束;”,outParameter)
@IvanStoev必须声明我不是实体框架向导,但是使用魔术字符串而不是说LINQ或任何其他类型安全提供程序会让我感觉很不好。@kayes我也是。但这是OP问题,这就是为什么我评论说它与EF无关。EF方法是使用
DbSet.Add(实体)
SaveChanges
和get
entity.Id
@IvanStoev是的,这就是我的意思。
myEntity.Database.ExecuteSqlCommand("insert into mytable (id, name) values ("+nextid+",'John')")