如何使用Entity Framework在事务中执行两个查询?

时间:2016-09-11 20:09:23

标签: entity-framework transactions

我在新项目中使用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?

1 个答案:

答案 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 });
}
相关问题