我对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>();
然而,当我尝试这个时,我得到“EntityConnection只能用一个封闭的DBConnection构建”。当我点击LINQ查询时。
有人知道这是否可能吗?
我正在使用EF4.1和Oracle ODP.NET Beta进行数据库访问,它连接到10.2.0.3.0服务器。
提前感谢您的帮助!
[编辑]
我设法从克雷格所提到的方面解决这个问题,并做了以下几点:
这允许我执行我的安全存储过程,并强制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>();