Могу ли я выполнить команду SQL для соединения DBContext перед загрузкой первого объекта EF? - PullRequest
3 голосов
/ 22 сентября 2011

Я довольно новичок в 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>(); 

1 Ответ

9 голосов
/ 22 сентября 2011

Не прорвись к такому соединению.Используйте ObjectContext.ExecuteStoreCommand .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...