【问题标题】:MVC EF Oracle: How do I use a sequence to generate the next ID on insert?MVC EF Oracle:如何使用序列在插入时生成下一个 ID?
【发布时间】:2017-07-13 15:52:45
【问题描述】:

首先使用 MVC 5、EF 6、Oracle 和数据库。我正在尝试自动生成一个名为 Mission 的对象的 ID。目前在数据库中有一个存储过程,它通过在插入命令上使用序列 MISSION_SEQ 来执行此操作。我无法让这个存储过程工作,所以我想我可以尝试自己处理它:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "<a bunch of fields, but I removed the MISSION_ID field")] MISSION mission)
{
    if (ModelState.IsValid)
    {
        string query = "select MISSION_SEQ.NEXTVAL from MISSION_SEQ";
        var query_result = db.Database.SqlQuery<decimal>(query); //throws error "sequence not allowed here"
        decimal mission_id = query_result.First();
        mission.MISSION_ID = (decimal)mission_id;
        db.MISSION.Add(mission);
        await db.SaveChangesAsync();
        return RedirectToAction("Index");
    }

    return View(mission);
}

我猜这会引发错误“此处不允许序列”,因为您只能在插入语句中使用 NEXTVAL。我想我可以只查询当前的 MISSION_IDs 并通过添加 1 来生成下一个,但是我如何确保如果多个用户正在创建,他们每个人都会得到一个唯一的数字?此外,如果创建失败,该 MISSION_ID 会丢失吗?我正在寻找任何帮助来为我指明正确的方向。谢谢。

【问题讨论】:

  • 从 DUAL 中选择 MISSION_SEQ.NEXTVAL 而不是 MISSION_SEQ 本身。

标签: asp.net-mvc oracle entity-framework asp.net-mvc-5 entity-framework-6


【解决方案1】:

将您的查询更改为使用 DUAL 而不是序列名称:

string query = "select MISSION_SEQ.NEXTVAL from DUAL";

【讨论】:

  • 天啊,我很笨。我从我从中获取代码的语句中看到了 DUAL,但我认为这是他们数据库中表的名称或其他东西。我刚刚查了一下 DUAL 是什么,现在它很有意义。谢谢!
  • 哦,我刚刚注意到它以 2 而不是 1 递增。序列表示递增 1。之前的 ID 是 25。Start With 数字是 26。当我创建时,我得到了 27 . 是我做错了什么还是有什么事情要去别的地方?没有任何触发器正在运行。也没有抛出错误。
  • 没关系。我认为问题是我有一行“如果 query_result.Count() > 0”或类似的东西。我认为这是重新运行再次增加 id 的查询。删除该行,一切都很好。
猜你喜欢
  • 2011-07-30
  • 2011-01-10
  • 1970-01-01
  • 2017-05-28
  • 2016-10-22
  • 2014-05-13
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
相关资源
最近更新 更多