【发布时间】: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