需要来自SaveChanges的ID,同时保存?实体框架

时间:2011-02-01 11:27:57

标签: entity-framework entity-framework-4 entity-framework-ctp5

我在数据库中插入一条记录,如下所示:

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

问题是,我无法正确创建TransactionUpdate,因为我没有'EndingTransactionId',或者我正在插入的事务的ID。

我该如何解决这个问题?

非常感谢。

解决

我已经完成了Ladislav建议的内容,现在正在创建要添加的项目列表,以及对插入它们所需的对象的引用。因此:

    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();
        }

2 个答案:

答案 0 :(得分:1)

根据您的描述,我猜您在数据库中使用自动生成的ID。在上下文中,您不会收到此{id}的执行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中以执行整个保存作为原子操作。

答案 1 :(得分:0)

如果您尚未插入TransactionId,则无论如何都要在对象中插入它。将您的对象作为参数传递给重载方法SaveChanges并使用它来传递Id