如何在EF Core 2.0中修改查询,在发送到SQL Server之前?

12

我需要波斯语翻译,查询应从字符角度首先进行清理/规范化。

应该使用波斯语的“ی”,而不是阿拉伯语的“ي”。

在EF 6中,我有一个拦截器,实现了IDbCommandInterceptor,并使用这条简单的代码更改原始SQL查询:

        command.CommandText = command.CommandText.SafePersianEncode();

这非常有益,可以降低成本、增加一致性、提高质量,并防止数据清理需求。

由于我们正在迁移到EF Core 2.0,我们意识到拦截器不可用,而且似乎未来版本也不会实现。

由于这是一个非常合法的需求,以及拦截流程的能力是一个众所周知的模式(例如Angular拦截器可以在一个地方修改所有HTTP请求/响应),从架构角度来看,它有助于以整齐的方式管理交叉关注点,那么现在我们该怎么办呢?

在EF Core 2.0中,有没有全局的方法(或任何方法)可以在SQL查询发送到SQL Server之前修改原始SQL查询?

1个回答

10

请查看此内容

https://blogs.msdn.microsoft.com/dotnet/2016/09/29/implementing-seeding-custom-conventions-and-interceptors-in-ef-core-1-0/

您可以覆盖 save changes 方法,在保存到数据库之前检测和修改更改。

示例:

 public override int SaveChanges(bool acceptAllChangesOnSuccess)
{
    ChangeTracker.DetectChanges();

    foreach (var entry in ChangeTracker.Entries().Where(e => e.State == EntityState.Added))
    {
        //modify entry.Entity here
    }

    ChangeTracker.AutoDetectChangesEnabled = false;
    var result = base.SaveChanges(acceptAllChangesOnSuccess);
    ChangeTracker.AutoDetectChangesEnabled = true;

    return result;
}

编辑:更改所有已修改的字符串属性的简单示例

public override int SaveChanges(bool acceptAllChangesOnSuccess)
        {
            ChangeTracker.DetectChanges();

            foreach (var entry in ChangeTracker.Entries()
                .Where(e => e.State == EntityState.Added ||
                     e.State == EntityState.Modified))
            {
                //modify entry.Entity here
                foreach (var prop in entry.Properties)
                {
                    if ((entry.State == EntityState.Added ||
                prop.IsModified) && prop.OriginalValue is string)
                        prop.CurrentValue = prop.CurrentValue + "edited";
                }
            }

            ChangeTracker.AutoDetectChangesEnabled = false;
            var result = base.SaveChanges(acceptAllChangesOnSuccess);
            ChangeTracker.AutoDetectChangesEnabled = true;

            return result;
        }

这个示例将在添加或编辑时更改任何string属性为xxedited并保存到数据库,您可以轻松构建基于old valueproperty type或访问实体本身的自定义规则等等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接