實體框架ObjectContext - >對本機DBMS的原始SQL調用

.net ado.net entity-framework postgresql

我有一個使用ADO.NET實體框架的應用程序(VS2008版本,而不是更新,更酷的版本),我需要能夠調用底層DBMS(它的postgres)以調用一些SQL實體框架不支持。

有沒有辦法從實體框架ObjectContext轉到可以讓我執行原始SQL的東西? (我需要在插入之前運行TRUNCATE TABLE)我可以使用hacky解決方案(例如從EF中提取DBMS的連接字符串信息,並使用它來使用postgres ADO.NET提供程序創建連接)但不要想要管理兩組連接字符串(一個用於實體框架,一個用於ADO.NET)。

我知道實體框架的第一個版本的限制,但是將這個應用程序切換到另一個ORM所需的投資是不值得的,並且使用EF 4.0也不是一個選項。

有任何想法嗎?

順便說一下,這是同樣的問題, 是否可以使用實體框架運行本機sql? ,但該答案中描述的解決方法對我不起作用,因為我確實需要執行原始SQL。

一般承認的答案

克雷格的答案雖然沒有按原樣發揮作用,但卻讓我朝著正確的方向前進。結果是有一個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
        }
    }

熱門答案

是的,你可以這樣做。查看EntityConnection.StoreConnection。您可以從ObjectContext中獲取連接。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因