2011-09-22 55 views
3

我對EF非常陌生,並且四處搜尋了一個沒有運氣的答案。在第一個EF實體加載之前,我可以在DBContext連接上執行SQL命令嗎?

實質上,當我在EF中獲得與db的連接時,我需要執行存儲過程來設置一些內部安全性,然後限制EF交互中帶回的數據。

摸索,我發現說下面應該工作信息:

String currentUser = "Name"; 
_db = new DBContext(); 
if (_db.Database.Connection.State != ConnectionState.Open) { 
    _db.Database.Connection.Open(); 
} 

DbConnection conn = _db.Database.Connection; 
DbCommand cmd = conn.CreateCommand(); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.CommandText = "storedproc"; 

DbParameter user = cmd.CreateParameter(); 
user.DbType = DbType.String; 
user.Direction = ParameterDirection.Input; 
user.Value = currentUser.ToUpper(); 
cmd.Parameters.Add(user); 
cmd.ExecuteNonQuery(); 

var customer = (from c in _db.Customer where c.ACCOUNT == inputAccount select c);   
response = customer.First<Customer>(); 

然而,當我嘗試,我得到了「EntityConnection只能用一個封閉的DBConnection的構建。」當我點擊LINQ查詢時。

有誰知道這是甚至可能嗎?

我正在使用EF4.1和用於訪問數據庫的Oracle ODP.NET Beta,它正在連接到10.2.0.3.0服務器。

在此先感謝您的幫助!

[編輯]

我設法通過這個從什麼克雷格提到的工作,並通過執行以下操作:

  • 供給開口之前我連接到的DbContext
  • 連接做了任何工作

這讓我執行我的安全存儲過程,也強制EF到保持連接打開,以便我的安全設置仍然有效。

代碼如下:

OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["DBConnect"].ConnectionString); 
_db = new DBContext(conn); 
_db.UnderlyingContext().Connection.Open(); 
_db.UnderlyingContext().ExecuteStoreCommand("execute storedproc"); 
_db.SaveChanges(); 
var customer = (from c in _db.Customer where c.ACCOUNT == inputAccount select c); 
response = customer.First<Customer>(); 
+0

你嘗試關閉'cmd.ExecuteNonQuery();'後面的連接嗎? – Eranga

+0

你爲什麼這樣做?這在概念上似乎是錯誤的。 –

+0

我遇到的問題是我需要在連接上運行一個存儲過程,然後限制我在數據庫中看到的內容。因此,存儲的proc將插入帶有ocelcel連接的SESSIONID的表格,這反過來影響了我將查詢的視圖。因此,如果我關閉連接,當通過EF重新連接時,我將擁有不同的Oracle會話ID,這會影響我的安全性。 – Nick

回答

9

不要通過半身這樣的連接。使用ObjectContext.ExecuteStoreCommand

+0

這使我可以執行Stored proc,但是在每次ExecuteStoreCommand調用後,連接仍然關閉。我真的需要一種方法來保持連接打開,直到我退出Web方法時處理它。 – Nick

+0

@Nick:那麼你應該明確地打開它,就像你在更新中顯示的那樣。 EF只關閉隱式打開的連接。 –

+0

感謝您的支持:) – Nick

相關問題