Я довольно новичок в EF, и безуспешно искал ответ на этот вопрос.
По сути, когда я получаю соединение с БД в EF, мне нужно выполнить хранимую процедуру для настройки некоторой внутренней безопасности, которая затем ограничит данные, возвращаемые во взаимодействиях 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.
Заранее спасибо за любую помощь!
[EDIT]
Мне удалось разобраться с этим из сказанного Крейгом и сделать следующее:
- Предоставление подключения к 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>();