0

Я вставив запись в базу данных, которая выглядит следующим образом:Требование Id от SaveChanges при сохранении? Entity Framework

class Transaction 
{ 
    int Id; 
} 

То, что я хочу, это когда я вставить этот объект, я хочу, чтобы создать еще одну запись, например:

class TransactionUpdate 
{ 
    int StartingTransactionId; 
    int EndingTransactionId; 
} 

Что я до сих пор представляет собой цикл в моем SaveChanges в DbContext, который берет новые объекты Transaction, которые будут созданы, и создает объекты TransationUpdate и связывает их с DbContext.

public override int SaveChanges() 
{ 
    foreach(var entry in this.ChangeTracker.Entries()) 
    { 
    if(entry.Entity is Transaction) 
    { 
     var update = new TransactionUpdate(); 
     update.StartingTransactionId = ((Transaction)entry.Entity).PreviousTransactionId; 
     update.EndingTransactionId = ((Transaction)entry.Entity).Id; // This is zero because the entity has not been inserted. 
     this.TransactionUpdates.Add(update); 
    } 
    } 
} 

Проблема заключается в том, что я не могу правильно создать TransactionUpdate, потому что у меня нет «EndingTransactionId», или идентификатор транзакции Сейчас я вставляя.

Как я могу решить эту проблему?

Большое спасибо.

решаемых

Я сделал то, что предложил Ладислав и теперь создать список элементов, чтобы добавить, наряду со ссылками на объекты, которые необходимы, чтобы вставить их. Таким образом:

public override int SaveChanges() 
    { 
     var transactionUpdatesToAdd = new List<Tuple<TransactionUpdate, Transaction>>(); 

     foreach (var entry in this.ChangeTracker.Entries<Transaction>()) 
     { 
      if (entry.State == EntityState.Added) 
      { 
       var update = new TransactionUpdate(); 
       update.StartingTransactionId = ((Transaction)entry.Entity).PreviousTransactionId; 
       transactionUpdatesToAdd.Add(new Tuple<TransactionUpdate, Transaction>(update, entry.Entity)); 
      } 
     } 

     using(var scope = new TransactionScope()) 
     { 
     // Save new Transactions 
     base.SaveChanges(); 

     // Update TransactionUpdates with new IDs 
     foreach (var updateData in transactionUpdatesToAdd) 
     { 
      updateData.Item1.EndingTransactionId = updateData.Item2.Id; 
      this.TransactionUpdates.Add(updateData.Item1); 
     } 

     // Insert the new TransactionUpdate entities. 
     return base.SaveChanges(); 
     } 

ответ

1

Основываясь на вашем описании, я предполагаю, что вы используете автогенерированный идентификатор в базе данных. Вы не получите этот Id befere, выполняющий SaveChanges в контексте. Вы должны разделить работу на две отдельные модификации:

public override int SaveChanges() 
{ 
    // call base context saving operation to insert all Transactions 
    base.SaveChanges(); 

    foreach(var entry in this.ChangeTracker.Entries())  
    {  
     if(entry.Entity is Transaction)  
     {   
     var update = new TransactionUpdate();   
     update.StartingTransactionId = ((Transaction)entry.Entity).PreviousTransactionId;   
     update.EndingTransactionId = ((Transaction)entry.Entity).Id;  
     this.TransactionUpdates.Add(update);  
     }  
    } 

    // save changes again to insert all TransactionUpdates 
    base.SaveChanges(); 
} 

Вы должны обернуть его в TransactionScope выполнить всю экономию в качестве атомарной операции.

+0

Я не хотел этого делать, я задавался вопросом, были ли какие-либо события, которые я мог бы подключить внутри EF? – James

+0

@James: Нет события после сохранения. Вы можете запустить настраиваемое событие в своей реализации SaveChanges, но в итоге вы получите тот же код. ИМО не может сделать это, не вызывая SaveChanges дважды или генерируя идентификаторы в вашем приложении. Нет причин избегать вызова SaveChanges дважды, потому что EF не поддерживает пакетную обработку команд. –

0

Если вы еще не указали TransactionId, у вас все равно будет свой объект. Передайте свой объект как параметр перегруженному методу SaveChanges и используйте его для передачи Id

+0

Извините, я не понял ничего из этого ... – James

 Смежные вопросы

  • Нет связанных вопросов^_^