Entity Framework ObjectContext -> raw SQL calls to native DBMS

前端 未结 4 1942
旧时难觅i
旧时难觅i 2021-01-13 19:52

I have an app using the ADO.NET entity framework (the VS2008 version, not the newer, cooler one) and I need to be able to make a call down to the underlying DBMS (it\'s post

相关标签:
4条回答
  • 2021-01-13 20:11

    Yes, you can do this. Look at EntityConnection.StoreConnection. You can get the connection out of the ObjectContext.

    0 讨论(0)
  • 2021-01-13 20:18

    Craig's answer, while it didn't work as-is, got me looking in the right direction. Turns out there's an EntityConnection.StoreConnection property which gets you a connection to the underlying DBMS. So executing "native" SQL is as easy as this:

        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
            }
        }
    
    0 讨论(0)
  • 2021-01-13 20:21

    Thanks Justin. I spent hours trying to figure out why the StoreConnection property was not available on my Entity Framework connection....

    The key piece for me was the fact that you have to formally cast your EF connection as a System.Data.EntityClient.EntityConnection:

    var newConn = (System.Data.EntityClient.EntityConnection)db.Connection;

    Once I did that it everything else made sense.

    0 讨论(0)
  • 2021-01-13 20:30

    According to this post there is no support of DML in Entity Framework V1.

    But there is support of stored procedures, but only such of them that return entities. That means if you create stored procedure in that way (sql server syntax):

    CREATE PROCEDURE [dbo].[usp_trncate]
    AS
    BEGIN
     truncate table t1
    END
    

    You can't import it as function (actually you can, but it won't work - no code for this function will be generated)

    I have found crutch solution to achive the goal: if you define sp as below:

    CREATE PROCEDURE [dbo].[usp_trncate]
    AS
    BEGIN
     truncate table t1
    
     select top 1 * from t1
    END
    

    you can import as function and use it in your code like this:

    TestEntities context = new TestEntities();
    context.TruncateTable();
    

    (TruncateTable is the name of imported function)

    I think there is another (better) solution. Other ways to digg are to tinker with .edmx file to make sp without return works or write another sp and map it to table insert function (that sp must truncate table and insert row)

    I hope it will help you.

    0 讨论(0)
提交回复
热议问题