Utilizzare prima MVC 5, EF 6, Oracle e database. Sto provando a generare automaticamente l'ID di un oggetto chiamato Mission. Attualmente nel database c'è una stored procedure che fa ciò usando una sequenza, MISSION_SEQ, sul comando insert. Sto avendo problemi a far funzionare questa stored procedure, quindi ho pensato di provare a gestirla da sola in questo modo:
[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);
}
Questo genera un errore "Sequenza non consentita qui", immagino perché puoi usare NEXTVAL solo in un'istruzione di inserimento. Penso che potrei semplicemente interrogare gli attuali MISSION_IDs e generare quello successivo aggiungendone 1, ma come posso assicurarmi che se più utenti stanno facendo una creazione, ognuno di essi ottiene un numero univoco? Inoltre, se la Creazione fallisce, MISSION_ID andrà perso? Sto cercando qualsiasi aiuto per indicarmi la giusta direzione qui. Grazie.
Modifica la query per utilizzare DUAL anziché il nome della sequenza:
string query = "select MISSION_SEQ.NEXTVAL from DUAL";