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

2023-12-11

我有一个使用 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
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐