实体框架拦截器添加实体

本文关键字:实体 添加 框架 | 更新日期: 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对被触发。