MVC EF Oracle:如何使用序列在插入时生成下一个ID?

时间:2017-07-13 15:52:46

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

首先使用MVC 5,EF 6,Oracle和数据库。我正在尝试自动生成名为Mission的对象的ID。目前在数据库中有一个存储过程,它通过在insert命令上使用序列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);
}

这会抛出一个错误“Sequence not allowed here”我想因为你只能在insert语句中使用NEXTVAL。我想我可以查询当前的MISSION_ID并通过向其添加1来生成下一个MISSION_ID,但是如何确保如果多个用户正在进行创建,他们每个都会得到一个唯一的数字?此外,如果创建失败,那么MISSION_ID会丢失吗?我正在寻找任何帮助,指出我在这里正确的方向。感谢。

1 个答案:

答案 0 :(得分:0)

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

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