我在新项目中使用Entity Framework 6.
我需要在同一个事务中执行两个不同的查询然后提交。但第二个查询需要第一个查询生成的id。
这就是我所做的
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult Add(ManageEmployeeAddTimeDialog model)
{
bool added = false;
if (ModelState.IsValid)
{
using (var conn = new BaseContext())
{
using (var dbTransaction = conn.Database.BeginTransaction())
{
try
{
var entry = conn.Entry.Add(new Entry(model)); // entry.Id is always 0!
conn.EntryRevision.Add(new EntryRevision(entry)); // this command needs the last inserted id aka entry.Id
conn.SaveChanges(); // Save changes?
added = true;
dbTransaction.Commit();
}
catch (Exception)
{
dbTransaction.Rollback();
throw;
}
}
}
}
return Json(new { Added = added });
}
事务似乎工作正常,因为我将两个记录都提交到数据库。但是,第二条记录将EntryId
0
而不是最后插入的ID。
我在这做什么?如何在事务中填充最后插入的id?
答案 0 :(得分:1)
首次添加后,您需要致电conn.SaveChanges();
。这将把插入应用于将创建新id的数据库。在调用提交之前,此Id不会保存到数据库中。
所以你的代码看起来像这样
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult Add(ManageEmployeeAddTimeDialog model)
{
bool added = false;
if (ModelState.IsValid)
{
using (var conn = new BaseContext())
{
using (var dbTransaction = conn.Database.BeginTransaction())
{
try
{
var entry = conn.Entry.Add(new Entry(model));
conn.SaveChanges();
conn.EntryRevision.Add(new EntryRevision(entry));
conn.SaveChanges();
added = true;
dbTransaction.Commit();
}
catch (Exception)
{
dbTransaction.Rollback();
throw;
}
}
}
}
return Json(new { Added = added });
}