打开连接后,是否必须显式关闭它?还是.net自动关闭?如果抛出异常该怎么办?
using (DataContext pContext = new DataContext())
{
pContext.Connection.Open()
using (var trx = pContext.Connection.BeginTransaction())
{
//make changes to objects
//Make calls to ExecuteStoreCommand("Update table SET pee=1 AND poop=2 WHERE ETC");
pContext.SaveChanges();
trx.Commit();
}
}
框架是否会在所有实例中调用pContext.Connection.Close()`?我知道在正常的using语句中可以,但是手动打开该怎么办?
我之所以使用Connection.BeginTransaction,是因为在我的测试中(仅使用SaveChanges()而不进行事务处理)如果此代码由于某种原因执行并失败,即使未更改对象,也将保存ExecuteStoreCommand()期间发送的命令。
我必须在调用pContext.Connection.BeginTransaction()之前先调用Connection.Open(),否则会出现错误:
Inner Exception:
The connection is not open.
任何帮助,将不胜感激。
最佳答案
无需调用DataContext.Connection.Open()。实际上,这样做是不好的做法。
上下文仅在需要时才打开连接。通过调用Connection.Open,您可以将连接打开所需的时间更长,从而增加了锁累积并导致阻塞的机会。这也是耗尽高流量系统中的连接池的好方法。
SaveChanges会打开一个连接和一个事务本身,因此不需要手动打开连接或启动事务。从the documentation:
SaveChanges在事务内运行。如果无法持久保存任何脏的ObjectStateEntry对象,则SaveChanges将回滚该事务并引发异常
仅当您想在EF会话中混合原始SQL命令时,才明确使用连接和事务才有意义。就其本身而言,这不是一个好习惯,但是如果您这样做,则不需要关闭连接,因为DataContext将在处理连接时将其关闭。文档中有一个示例,位于How to: Manually Open the Connection from the Object Context
您还可以使用TransactionScope处理事务,如How to: Manage Transactions in the Entity Framework中所述。在这种情况下,您无需打开连接,因为所有更改都会自动登记在当前事务中。这在http://msdn.microsoft.com/en-us/library/bb738523(v=vs.100).aspx中进行了描述,示例为:
using (DataContext pContext = new DataContext())
{
using (TransactionScope transaction = new TransactionScope())
{
//execute commands
pContext.SaveChanges();
transaction.Complete()
}
}
在任何情况下,手动处理连接和事务都是不简单的。您应该阅读Managing Connections and Transactions了解一些需要注意的内容
关于c# - EF使用和BeginTransaction,何时调用Connection.Close()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19923760/