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

时间:2011-09-22 11:16:21

标签: .net entity-framework

我对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服务器。

提前感谢您的帮助!

[编辑]

我设法从克雷格所提到的方面解决这个问题,并做了以下几点:

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

1 个答案:

答案 0 :(得分:9)

不要破坏这样的连接。使用ObjectContext.ExecuteStoreCommand