C# 如何在EF Core 2.0中修改查询,然后再将其转到SQL Server?
我需要波斯语,在波斯语中,首先应该从字符的角度对查询进行清理/规范化 应使用波斯语“ی”代替阿拉伯语“ي” 在EF 6中,我有一个拦截器,它将实现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时,我们意识到
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
,并保存到数据库。您可以根据旧值
、属性类型
或访问实体本身在此处轻松构建自定义规则。等等