如何在单笔交易中重复使用从 Entity Framework 返回的 ID

How to re-use ID returned from Entity Framework in a single transaction

我有以下情况:

public class Car 
{
     public int ID {get;set} // identity in DB
     ...
}

public class Book
{
    public int ID {get; set;} // identity in DB
    public int Number {get; set;}
    .....
}

由于这两个实体没有关系,无论是在数据库还是在 EF 模型中,我正在尝试获取 CarID 并将其添加到 Number 字段,所有这些都在一个数据库事务中,没有更新。

我知道如何在 T-SQL:

 INSERT INTO dbo.Car ()...
 INSERT INTO dbo.Book(Number) VALUES scope_identity. 

以下代码在 C# + EF 中(不是 CORE)。

public void MyMethod()
{
   var newCar = newCar();
   var newBook = newBook();

  myContext.Cars.Add(newCar);
  myContext.Books.Add(newBook);
  newBook.Number = newCar.ID;

  myContext.SaveChanges();
}
//this example doesn't work, Number is always 0.

上面的例子是简化的,可能违反了一些模式,但关键是如何让这个与 EF 一起工作。

您必须在 Car 上调用 SaveChanges() 才能获得新记录的 ID,因为 ID 是一个身份。

您可以使用 EF Transaction 来确保仅当同时创建 Book 记录时才创建 Car 记录。

using (var myContext = new DbContext())
        {
            using (var transaction = myContext.Database.BeginTransaction())
            {
                try
                {
                    var newCar = new Car();
                    myContext.Cars.Add(newCar);
                    myContext.SaveChanges();

                    var newBook = new Book();
                    newBook.Number = newCar.Id;

                    myContext.Books.Add(newBook);
                    myContext.SaveChanges();

                    // Commit transaction if all commands succeed, transaction will auto-rollback
                    // when disposed if either commands fails
                    transaction.Commit();
                }
                catch (Exception)
                {
                    // TODO: Handle failure
                }
            }
        }