Как повторно использовать идентификатор, возвращенный из Entity Framework, в одной транзакции - PullRequest
0 голосов
/ 26 апреля 2018

У меня следующая ситуация:

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;}
    .....
}

Поскольку эти два объекта не связаны друг с другом, ни в DB, ​​ни в модели 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.

1 Ответ

0 голосов
/ 26 апреля 2018

Вы должны позвонить SaveChanges() на Car, прежде чем сможете получить Id новой записи, поскольку Id является идентификатором.

Вы можете использовать EF Transaction , чтобы гарантироватьчто запись об автомобиле создается только в том случае, если также создается запись о книге.

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
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...