Я вставив запись в базу данных, которая выглядит следующим образом:Требование 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();
}
Я не хотел этого делать, я задавался вопросом, были ли какие-либо события, которые я мог бы подключить внутри EF? – James
@James: Нет события после сохранения. Вы можете запустить настраиваемое событие в своей реализации SaveChanges, но в итоге вы получите тот же код. ИМО не может сделать это, не вызывая SaveChanges дважды или генерируя идентификаторы в вашем приложении. Нет причин избегать вызова SaveChanges дважды, потому что EF не поддерживает пакетную обработку команд. –