[英]Entity Framework SaveChanges is saving unchanged record (via stored procedure mapping)
[英]Requiring an Id from SaveChanges, whilst saving? 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);
}
}
}
问题是,由于我没有'EndingTransactionId',或者我当前正在插入的交易ID,我无法正确创建TransactionUpdate。
我怎么解决这个问题?
非常感谢。
解决了
我已经完成了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();
}
根据您的描述,我想您正在数据库中使用自动生成的ID。 如果在上下文上执行SaveChanges
,您将不会收到此ID。 您必须将操作分为两个单独的修改:
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
以执行整个保存为原子操作。
如果您尚未插入TransactionId,则无论如何在您的对象中都有它。 将您的对象作为参数传递给重载的方法SaveChanges并使用它传递Id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.