我在数据库中插入一条记录,如下所示:
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();
}
答案 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