私はこのようになりますこれは、データベースにレコードを挿入しています:、私が欲しい保存中にSaveChangesのIDを要求していますか? Entity Frameworkの
class Transaction
{
int Id;
}
私は、このオブジェクトを挿入すると、私はこのような別のレコードを、作成したいです:
class TransactionUpdate
{
int StartingTransactionId;
int EndingTransactionId;
}
私がこれまで持っていたことは、DbContextのSaveChangesのループで、新しい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);
}
}
}
の問題は、私は現在挿入していますトランザクションのID「EndingTransactionId」私が持っていないので、私はきちんとTransactionUpdateを作成することはできません、である、または。
どのように私はこの問題を解決することができますか?
多くのありがとうございます。
は、私はラディスラフが提案し、ここでそれらを挿入するために必要とされているオブジェクトへの参照とともに、追加する項目のリストを作成していますどのように行われている
を解決しました。従って:
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実装でカスタムイベントを発生させることはできますが、同じコードで終了します。 IMOには、SaveChangesを2回呼び出すことなく、またはアプリケーションでIDを生成せずに行う方法はありません。 EFがコマンドのバッチ処理をサポートしていないため、SaveChangesを2回呼び出すことを避ける理由はありません。 –