我對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>();
你嘗試關閉'cmd.ExecuteNonQuery();'後面的連接嗎? – Eranga
你爲什麼這樣做?這在概念上似乎是錯誤的。 –
我遇到的問題是我需要在連接上運行一個存儲過程,然後限制我在數據庫中看到的內容。因此,存儲的proc將插入帶有ocelcel連接的SESSIONID的表格,這反過來影響了我將查詢的視圖。因此,如果我關閉連接,當通過EF重新連接時,我將擁有不同的Oracle會話ID,這會影響我的安全性。 – Nick