【问题标题】:What is the best way to get the inserted ID in oracle using EF?使用 EF 在 oracle 中获取插入 ID 的最佳方法是什么?
【发布时间】:2017-08-24 14:18:39
【问题描述】:

我有这样的查询

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

mytable_SEQ 是为 mytable 生成唯一 ID 而创建的序列

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

【问题讨论】:

  • 我认为这与 EF 无关。您可以引入 OUT 参数并使用 Oracle SQL RETURNING 子句
  • 它不需要是SP。它可以是匿名 PL/SQL 块,例如类似ExecuteSqlCommand("begin insert into .... returning id into p_Id; end;", outParameter);
  • @IvanStoev 必须声明我不是实体框架向导,但是使用魔术字符串而不是说 LINQ 或任何其他类型安全的提供程序让我有一种不好的感觉。跨度>
  • @kayess 我也是。但那是 OP 问题,这就是为什么我评论它与 EF 无关。 EF 方式是使用DbSet.Add(entity)SaveChanges 并获取entity.Id
  • @IvanStoev 是的,这就是我的意思。

标签: c# oracle entity-framework sequence


【解决方案1】:

没有最好的方法。有几种方法可以实现您想要的。基本上第一个是执行sequence.CURRVAL 来获取序列的当前值。您还可以使用MAX(id) 进行查询以获取 ID 列的最大值。

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

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

【讨论】:

  • 我打算对并发说同样的话。没有其他可靠的解决方案?
  • 在 sql server 中,你可以添加 OUPUT INSERTED.ID 并获取你的 ID,太遗憾了,oracle 中没有这样的东西。无需提及添加简单标识列的复杂性。
  • 我会接受你的解决方案,因为我的应用程序不会有任何并发​​,因为我的应用程序没有太多客户端,而且我有办法在插入后检查它是否是正确的记录..跨度>
  • "在sql server中你可以添加OUPUT INSERTED.ID并获取你的ID,可惜oracle中没有这样的东西。"Oracle中有这样的东西。这是returning id into 语法,但当@ivanstoev 建议时你不喜欢它。所以真的不知道你想要什么。
【解决方案2】:

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

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

然后

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

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

【讨论】:

    猜你喜欢
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2011-08-17
    相关资源
    最近更新 更多