Entity Framework ObjectContext -> Raw-SQL-Aufrufe an das native DBMS

.net ado.net entity-framework postgresql

Frage

Ich habe eine App, die das ADO.NET-Entity-Framework verwendet (die VS2008-Version, nicht die neuere, coolere), und ich muss in der Lage sein, das zugrunde liegende DBMS (es ist postgres) aufzurufen, um einige SQL-Entitäten aufzurufen Framework unterstützt nicht.

Gibt es eine Möglichkeit, von Entity Framework ObjectContext zu etwas zu wechseln, mit dem ich Raw-SQL ausführen kann? (Ich muss vor dem Einfügen eine TRUNCATE TABLE ausführen.) Ich bin mit einer Hacky-Lösung in Ordnung (z. B. die DBMS-Informationen zur Verbindungszeichenfolge von EF abrufen und mit dem postgres-ADO.NET-Provider eine Verbindung herstellen), aber nicht Sie möchten zwei Gruppen von Verbindungszeichenfolgen verwalten (eine für das Entity Framework, eine für ADO.NET).

Ich bin mir der Grenzen der ersten Version von Entity Framework bewusst, aber es lohnt sich nicht, diese App auf ein anderes ORM umzustellen. EF 4.0 ist auch keine Option.

Irgendwelche Ideen?

Übrigens, das ist die gleiche Frage wie ist es möglich, native SQL mit Entity Framework auszuführen? , aber die in dieser Antwort beschriebene Problemumgehung funktioniert für mich nicht, da ich wirklich Raw SQL ausführen muss.

Akzeptierte Antwort

Craig antwortete, obwohl es nicht so funktioniert hat, dass ich in die richtige Richtung schaue. Es stellt sich heraus, dass es eine EntityConnection.StoreConnection-Eigenschaft gibt, mit der Sie eine Verbindung zum zugrunde liegenden DBMS erhalten. So einfach ist das Ausführen von "nativem" 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
        }
    }

Beliebte Antwort

Ja, das kannst du tun. Schauen Sie sich EntityConnection.StoreConnection an. Sie können die Verbindung vom ObjectContext abrufen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum