2009-11-05 31 views
5

Có cách nào để chạy câu lệnh sql trực tiếp từ các cuộc gọi được tạo ra bởi khung thực thể không? Hoặc tôi sẽ phải tạo một thủ tục sau đó gọi đó thông qua khung thực thể?Chạy sql trong khung thực thể?

Trả lời

10

Được Googling xung quanh cho điều này bản thân mình ngày khác, đây là ví dụ tôi tìm thấy hy vọng nó giúp

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(); 
      using (DbCommand cmd = conn.CreateCommand()) 
      { 
       cmd.CommandText = sql; 
       cmd.ExecuteNonQuery(); 
      } 
     } 
     finally 
     { 
      if (initialState != ConnectionState.Open) 
       conn.Close(); 
     } 
    } 
+1

tôi sẽ tư vấn việc sử dụng ExecuteStoreCommand() trong ObjectContext thay vì ExecuteSql trên() –

5

Trong EF 4.0 này là khá dễ dàng vì có phương pháp mới trên ObjectContext cho phép bạn thực hiện các lệnh lưu trữ (ví dụ SQL) trực tiếp:

Xem này: ExecuteStoreCommand

Nếu bạn vẫn đang sử dụng EF 3.5 SP1 bạn vẫn có thể thực hiện một truy vấn trực tiếp chống lại các cơ sở dữ liệu nếu bạn thực sự muốn như thế này:

var econn = ctx.Connection as EntityConnection; 
var dbconn = econn.StoreConnection; 

vào thời điểm này, bạn có thể truy cập vào một kết nối (dbconn) cơ sở dữ liệu cơ bản, vì vậy bạn có thể sử dụng mã ADO.NET bình thường để thực hiện truy vấn, vv

Hope this helps

Alex

0

@ Alex James, vì tò mò, sẽ này được hiệu quả để chạy một chút văn bản sql đầy đủ các mã, như trong không nên có chi phí hoạt động đúng không? Để nói, hãy chạy cùng một mã sql văn bản đầy đủ thẳng như một truy vấn trong studio quản lý sql.

1

ExecuteStoreQuery<>ExecuteStoreCommand được những gì bạn muốn:

using (NorthWindEntities ctx = new NorthWindEntities()) 
{ 
    ctx.ExecuteStoreQuery<>() 
    ctx.ExecuteStoreCommand(); 
} 
Các vấn đề liên quan