Entity Framework ObjectContext -> appels SQL bruts vers un SGBD natif

.net ado.net entity-framework postgresql

Question

J'ai une application utilisant le framework d'entité ADO.NET (la version VS2008, pas la plus récente et la plus cool) et j'ai besoin de pouvoir faire un appel vers le SGBD sous-jacent (c'est postgres) afin d'appeler du code SQL qu'Entity Le cadre ne supporte pas.

Existe-t-il un moyen de passer d'un ObjectContext Entity Framework à quelque chose qui me permette d'exécuter du SQL brut? (Je dois exécuter une table TRUNCATE TABLE avant de l'insérer.) Je suis d'accord avec une solution de hacky (par exemple, extraire les informations de chaîne de connexion du SGBD à partir de EF et les utiliser pour créer une connexion à l'aide du fournisseur ADO.NET postgres), mais ne le faites pas. vouloir gérer deux ensembles de chaînes de connexion (un pour l'entité framework, un pour ADO.NET).

Je suis conscient des limites de la première version d'Entity Framework, mais l'investissement requis pour passer de cette application à un autre ORM ne vaut pas la peine, et utiliser EF 4.0 n'est pas une option non plus.

Des idées?

BTW, c'est la même question Est-il possible d'exécuter SQL natif avec le cadre d'entité? , mais la solution de contournement décrite dans cette réponse ne fonctionnera pas pour moi car j’ai vraiment besoin d’exécuter du SQL brut.

Réponse acceptée

La réponse de Craig, bien que cela n'ait pas fonctionné tel quel, m'a permis de regarder dans la bonne direction. Il se trouve qu'il existe une propriété EntityConnection.StoreConnection qui vous permet de vous connecter au SGBD sous-jacent. Donc, exécuter du SQL "natif" est aussi simple que ça:

    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
        }
    }

Réponse populaire

Oui, tu peux faire ça. Regardez EntityConnection.StoreConnection. Vous pouvez établir la connexion à partir de ObjectContext.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow