如何在单笔交易中重复使用从 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
}
}
}
我有以下情况:
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
}
}
}