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

moh*_*eli 9 c# sql-server entity-framework entity-framework-core

我对波斯语有这种需求,首先应该从字符的角度对查询进行清理/规范化.

应该使用波斯语"ی"而不是阿拉伯语"ي".

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

        command.CommandText = command.CommandText.SafePersianEncode();
Run Code Online (Sandbox Code Playgroud)

这非常有益,可以降低成本,提高一致性,提高质量并防止数据清理要求.

当我们迁移到EF Core 2.0时,我们意识到拦截器不存在,似乎它们也不会在未来的版本中实现.

由于这是一个非常合理的要求,拦截流的能力是一个众所周知的模式(如Angular拦截器在一个地方修改所有HTTP请求/响应),从架构的角度来看,它有助于管理跨领域的问题一个整洁的方式,我们现在应该做什么?

是否有一种全局方式(或者说根本没有)我们可以在它转到EF Core 2.0中的SQL Server之前修改RAW SQL查询?

Abd*_*bdo 7

看看这个

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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;
        }
Run Code Online (Sandbox Code Playgroud)

此示例将更改string添加或编辑的任何属性xxedited并保存到数据库,您可以在此处轻松构建自定义规则old value,property type或访问实体本身.等等