实体框架拦截器添加实体

时间:2014-03-19 21:26:14

标签: c# entity-framework interception

我正在使用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());
    }

1 个答案:

答案 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对。 (正如我自己测试的那样)。