实体框架拦截器添加实体
本文关键字:实体 添加 框架 | 更新日期: 2023-09-27 17:51:04
我正在使用EF 6,并试图从System.Data.Entity.Infrastructure.Interception命名空间使用IDbCommandInterceptor。
它可以很好地读取和更新,但是当我向数据库添加一个新实体时,nonqueryperformed()不触发,nonqueryexecution()也不触发。这是拦截器的正常行为,还是在我的终端上没有正确实现?
代码:拦截: 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());
}
这是设计。当插入具有数据库生成标识的实体时,插入语句伴随着SELECT
语句,将生成的标识值读入所插入实体的Id属性。命令的形状是:
INSERT [dbo].[Table](...)
VALUES (...)
SELECT [Id]
FROM [dbo].[Table]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()
触发ReaderExecuting/ReaderExecuted
对
另一方面,如果一个实体没有数据库生成的身份,则可以直接插入该实体,而不需要后续的SELECT
语句。在这种情况下,NonQueryExecuting/NonQueryExecuted
对被触发。