打开连接后,是否必须显式关闭它?还是.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/

10-16 11:45