C# 如何在EF Core 2.0中修改查询,然后再将其转到SQL Server?

C# 如何在EF Core 2.0中修改查询,然后再将其转到SQL Server?,c#,sql-server,entity-framework,entity-framework-core,C#,Sql Server,Entity Framework,Entity Framework Core,我需要波斯语,在波斯语中,首先应该从字符的角度对查询进行清理/规范化 应使用波斯语“ی”代替阿拉伯语“ي” 在EF 6中,我有一个拦截器,它将实现IDbCommandInterceptor,并将使用以下简单的代码行更改原始SQL查询: command.CommandText = command.CommandText.SafePersianEncode(); 这非常有益,降低了成本,提高了一致性,提高了质量,并防止了数据清理需求 当我们迁移到EF Core 2.0时,我们意识到

我需要波斯语,在波斯语中,首先应该从字符的角度对查询进行清理/规范化

应使用波斯语“ی”代替阿拉伯语“ي”

在EF 6中,我有一个拦截器,它将实现
IDbCommandInterceptor
,并将使用以下简单的代码行更改原始SQL查询:

        command.CommandText = command.CommandText.SafePersianEncode();
这非常有益,降低了成本,提高了一致性,提高了质量,并防止了数据清理需求

当我们迁移到EF Core 2.0时,我们意识到了这一点,而且似乎它们也不会在未来的版本中实现

由于这是一个非常合理的要求,并且拦截流的能力是一个众所周知的模式(就像在一个地方修改所有HTTP请求/响应的角度拦截器),并且从架构的角度来看,它有助于以一种整洁的方式管理横切关注点,我们现在应该做什么

在EF Core 2.0中,有没有一种全局方法(或者无论如何)可以在原始SQL查询进入SQL Server之前对其进行修改

您可以覆盖
保存更改
以在保存到数据库之前检测、修改更改

例如:

 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;
        }
此示例将添加或编辑时的任何
字符串
属性更改为
xxedited
,并保存到数据库。您可以根据
旧值
属性类型
或访问实体本身在此处轻松构建自定义规则。等等