1

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

任何帮助,将不胜感激。

4

2 回答 2

9

无需调用 DataContext.Connection.Open()。事实上,这样做是不好的做法。

上下文仅在需要时打开连接。通过调用 Connection.Open,您可以将连接打开所需的时间更长,从而增加锁累积并导致阻塞的机会。这也是在高流量系统中耗尽连接池的好方法。

SaveChanges 会打开一个连接和一个事务本身,因此无需手动打开连接或启动事务。从文档中

SaveChanges 在事务中运行。如果任何脏 ObjectStateEntry 对象无法持久保存,SaveChanges 将回滚该事务并引发异常

仅当您想在 EF 会话中混合原始 SQL 命令时,显式使用连接和事务才有意义。就其本身而言,这不是一个好习惯,但如果这样做,则不需要关闭连接,因为 DataContext 将在释放连接时关闭连接。文档中有一个示例,位于How to: Manually Open the Connection from the Object Context

您还可以使用 TransactionScope 处理事务,如如何:在实体框架中管理事务中所述。在这种情况下,您不需要打开连接,因为所有更改都会自动登记在当前事务中。这在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()
    }
}

无论如何,手动处理连接和事务并非易事。您应该阅读管理连接和事务以了解您需要注意的一些事项

于 2013-11-12T08:05:40.037 回答
1

这表示

using (DataContext pContext = new DataContext())

pContext 在离开后使用

它相当于:

DataContext pContext = new DataContext()
try
{
   //do stuff here
}
finally
{
   if(pContext!=null)
      ((IDisposable)pContext).Dispose();
}

所以答案是 -> 你不需要在你的代码之后调用 close 因为

当您在连接上调用 Close 或 Dispose 时,连接将被释放回池中..."

这里

于 2013-11-12T07:58:17.360 回答