我可以在加载第一个EF实体之前在DBContext连接上执行SQL命令吗?



我是EF的新手,一直在寻找这个问题的答案,可惜运气不好。

实际上,当我连接到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>();

然而,当我尝试这样做时,当我点击LINQ查询时,我得到"EntityConnection只能用一个关闭的DBConnection构造"。

有人知道这是可能的吗?

我使用EF4.1,和Oracle ODP。. NET测试版用于我的数据库访问,它连接到10.2.0.3.0服务器。

提前感谢您的帮助!

[编辑]

根据Craig提到的,我设法解决了这个问题,并做了以下工作:

  • 提供到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>(); 

不要那样插队。使用ObjectContext.ExecuteStoreCommand。

最新更新