我可以在同一个 DataContext.Connection 上安全地混合 Linq-to-SQL 查询和非 Linq-to-SQL 查询吗?

Can I safely intermix Linq-to-SQL queries and non-Linq-to-SQL queries on the same DataContext.Connection?

假设我有这种形式的代码:

using (var dc = new MyDataContext()) {
    // ...code that may or may not look up objects via Linq-to-SQL...

    // ...code that may or may not *update* objects via Linq-to-SQL...
    // and call SubmitChanges...

    // Non-Linq-to-SQL code:
    dc.Connection.Open(); // <== I believe I need to do this
    using (SqlCommand cmd = dc.Connection.CreateCommand()) {
        // ...set up the command...
        using (SqlDataReader reader = cmd.ExecuteReader()) {
            // ...use the reader here...
        }
    }

    // ...more code that may or may not look up objects via Linq-to-SQL...

    // ...more code that may or may not *update* objects via Linq-to-SQL...
    // and call SubmitChanges...
}

这样安全吗,例如,我可以像那样选择连接吗?如果上面的代码不必进行任何数据库调用,我必须调用 Open 是否正确?

This MSDN page 好像说这个可以:

The DataContext is the main conduit by which you connect to a database, retrieve objects from it, and submit changes back to it. You use the DataContext just as you would use an ADO.NET SqlConnection.

(是的,这都是在单个工作单元的上下文中,符合DataContext的概念。只是它是一个复杂的工作单元。)

如果重要的话,我在这个项目中被困在 .Net 3.5 中。

是的,这样做是非常明智的。是的,您必须在使用它访问数据库之前打开连接,因为 LINQ-to-SQL 会在每次数据库交互后关闭连接。同样,使用完毕后关闭连接也是一种很好的做法。

如果使用和不使用 LINQ-to-SQL 所做的事情应该是事务性的,您可能希望将整个代码片段包装在 using TransactionScope.

我在 Entity Framework 上下文中做类似的事情,当我必须使新旧代码协同工作时。我假设您知道 LINQ-to-SQL 不会跟踪您自己通过连接所做的任何 reads/updates。