我正在使用EF 6并尝试使用System.Data.Entity.Infrastructure.Interception命名空间中的IDbCommandInterceptor。
它适用于读取和更新,但是当我向数据库添加新实体时,NonQueryExecuted()不会触发,NonQueryExecuting()也不会触发。这是拦截器的正常行为,还是我的结果没有正确实现?
代码:
拦截器:
public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
this.MonitorAndNotifySignalRService(command);
}
public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
}
public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
}
public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
}
public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
{
}
public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
{
}
DataContextBase:
static Constructor()
{
Database.SetInitializer<TDataContext>(null); // turn off database initialization so the db schema is not changed from the model
DbInterception.Add(new Interceptor());
}
答案 0 :(得分:3)
这是设计的。插入具有数据库生成标识的实体时,insert语句附带SELECT
语句,以将生成的标识值读入插入实体的Id属性。该命令具有以下形状:
INSERT [dbo].[Table](...)
VALUES (...)
SELECT [Id]
FROM [dbo].[Table]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()
它会触发ReaderExecuting/ReaderExecuted
对。
另一方面,如果实体没有获得数据库生成的标识,则只需插入实体而不使用后续的SELECT
语句。在这种情况下,会触发NonQueryExecuting/NonQueryExecuted
对。 (正如我自己测试的那样)。