Необходимо, чтобы клиент регистрировал каждое изменение данных в таблице протоколирования с фактическим пользователем, внесшим изменения. Приложение использует один пользователь SQL для доступа к базе данных, но нам нужно зарегистрировать "настоящий" идентификатор пользователя.
Мы можем сделать это в t-sql, написав триггеры для каждой вставки и обновления таблицы и используя context_info для хранения идентификатора пользователя. Мы передали идентификатор пользователя в хранимую процедуру, сохранили идентификатор пользователя в контекстеinfo, и триггер мог использовать эту информацию для записи строк журнала в таблицу журналов.
Я не могу найти место или способ, где и как я могу сделать что-то подобное с помощью EF. Таким образом, главная цель: если я вношу изменения в данные через EF, я хотел бы записать точное изменение данных в таблицу полуавтоматическим способом (поэтому я не хочу проверять каждое поле для изменения до сохранение объекта). Мы используем EntitySQL.
К сожалению, мы должны придерживаться SQL 2000, поэтому захват смены данных, введенный в SQL2008, не является вариантом (но, возможно, это также не подходит для нас).
Любые идеи, ссылки или отправные точки?
[изменить] Некоторые примечания: с помощью обработчика событий ObjectContext.SavingChanges я могу получить точку, в которой я могу ввести инструкцию SQL для инициализации contextinfo. Однако я не могу смешивать EF и стандартный SQL. Поэтому я могу получить EntityConnection, но я не могу выполнить оператор T-SQL, используя его. Или я могу получить строку соединения EntityConnection и создать на ней SqlConnection, но это будет другое соединение, поэтому contextinfo не повлияет на сохранение, сделанное EF.
Я попробовал следующее в обработчике SavingChanges:
testEntities te = (testEntities)sender;
DbConnection dc = te.Connection;
DbCommand dcc = dc.CreateCommand();
dcc.CommandType = CommandType.StoredProcedure;
DbParameter dp = new EntityParameter();
dp.ParameterName = "userid";
dp.Value = textBox1.Text;
dcc.CommandText = "userinit";
dcc.Parameters.Add(dp);
dcc.ExecuteNonQuery();
Ошибка: значение EntityCommand.CommandText недействительно для команды StoredProcedure. То же самое с SqlParameter вместо EntityParameter: SqlParameter не может использоваться.
StringBuilder cStr = new StringBuilder("declare @tx char(50); set @tx='");
cStr.Append(textBox1.Text);
cStr.Append("'; declare @m binary(128); set @m = cast(@tx as binary(128)); set context_info @m;");
testEntities te = (testEntities)sender;
DbConnection dc = te.Connection;
DbCommand dcc = dc.CreateCommand();
dcc.CommandType = CommandType.Text;
dcc.CommandText = cStr.ToString();
dcc.ExecuteNonQuery();
Ошибка: синтаксис запроса недействителен.
Итак, вот я, застрял, чтобы создать мост между Entity Framework и ADO.NET. Если я смогу заставить его работать, я опубликую доказательство концепции.