我是EF 4.1的新手,我试图使用EF和DB First方法将对象列表添加到sql表中。
1)我应该在AddObject(Trans)之后在for循环内调用context.SaveChanges()还是可以在循环外调用它?
2)另外,如果发生错误,是否将所有事务回滚? 我已经读过实体框架已经支持本机数据库事务,如果无法持久保存任何脏的ObjectStateEntry对象,则ObjectContext.SaveChanges将回滚该事务并引发异常。
3)还有什么可以做以提高性能?我将一口气插入大约1200条记录。
try
{
using (TransactionModel context = new TransactionModel())
{
try
{
foreach (var item in lstUnAllocatedTransaction)
{
Transaction Trans = new Transaction();
Trans.Amount = item.Amount;
Trans.Date = Datetime.Now;
Trans.DateAllocated = null;
context.Transactions.AddObject(Trans);
}
context.SaveChanges();
}
catch (Exception ex)
{
}
}
}
catch (Exception ex)
{
}
}
答案 0 :(得分:1)
1)我应该在AddObject(Trans)之后在for循环内调用context.SaveChanges()还是可以在循环外调用它?
如果整个添加操作都是一个事务,则可以在循环外调用(并且更好)。如果您需要每一项交易,那么显然您需要在循环中调用它。
2)另外,如果发生错误,是否将所有事务回滚?我已经读过实体框架已经支持本机数据库事务,如果无法持久保存任何脏的ObjectStateEntry对象,则ObjectContext.SaveChanges将回滚该事务并引发异常。
只有最后一笔交易将被回滚。这就是为什么1)有所作为。如果要插入全或无,则需要全部添加,然后调用一次SaveChanges
。
3)还有什么可以做以提高性能?我将一口气插入大约1200条记录。
您可以致电AddRange
而不是Add
,否则我很少遇到记录少的问题。如果您认为它太慢,请查看大量插入内容。 EF没有内置功能可以执行此操作,您将需要扩展。