客户需要将每个数据更改记录到与进行修改的实际用户的日志记录表中.应用程序使用一个SQL用户来访问数据库,但我们需要记录"真实"用户ID.
我们可以在t-sql中通过为每个表插入和更新编写触发器,并使用context_info来存储用户ID来完成此操作.我们将用户标识传递给存储过程,将用户标识存储在contextinfo中,触发器可以使用此信息将日志行写入日志表.
我无法找到使用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();
Run Code Online (Sandbox Code Playgroud)
错误: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 …Run Code Online (Sandbox Code Playgroud) 实体框架ObjectSet及其方法ToList显示刚刚保存的实体.这意味着,当我打电话时
context.AddToCustomers(myNewCust);
Run Code Online (Sandbox Code Playgroud)
然后(不调用SaveChanges)
myDataGrid.DataContext = context.Customers.ToList();
Run Code Online (Sandbox Code Playgroud)
DataGrid不显示新添加的实体(甚至context.Customers.Count()不包括它).
有没有办法显示这些实体(那些实体EntityState = Added)?
提前致谢.