实体框架ObjectContext - >对本机DBMS的原始SQL调用

Jus*_*ant 4 .net postgresql ado.net entity-framework

我有一个使用ADO.NET实体框架的应用程序(VS2008版本,而不是更新,更酷的版本),我需要能够调用底层DBMS(它的postgres)以调用一些SQL实体框架不支持.

有没有办法从实体框架ObjectContext转到可以让我执行原始SQL的东西?(我需要在插入之前运行TRUNCATE TABLE)我可以使用hacky解决方案(例如从EF中提取DBMS的连接字符串信息,并使用它来使用postgres ADO.NET提供程序创建连接)但不要想要管理两组连接字符串(一个用于实体框架,一个用于ADO.NET).

我知道实体框架的第一个版本的限制,但是将这个应用程序切换到另一个ORM所需的投资是不值得的,并且使用EF 4.0也不是一个选项.

有任何想法吗?

顺便说一下,这是同样的问题,是否可以使用实体框架运行本机sql?,但该答案中描述的解决方法对我不起作用,因为我确实需要执行原始SQL.

Jus*_*ant 17

克雷格的答案虽然没有按原样发挥作用,但却让我朝着正确的方向前进.结果是有一个EntityConnection.StoreConnection属性,它可以获得与底层DBMS的连接.因此,执行"本机"SQL就像这样简单:

    static void ExecuteSql(ObjectContext c, string sql)
    {
        var entityConnection = (System.Data.EntityClient.EntityConnection)c.Connection;
        DbConnection conn = entityConnection.StoreConnection;

        ConnectionState initialState = conn.State;
        try
        {
            if (initialState != ConnectionState.Open)
                conn.Open();  // open connection if not already open
            using (DbCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = sql;
                cmd.ExecuteNonQuery();
            }
        }
        finally
        {
            if (initialState != ConnectionState.Open)
                conn.Close(); // only close connection if not initially open
        }
    }
Run Code Online (Sandbox Code Playgroud)