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查询?
看看这个
您可以覆盖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
或访问实体本身.等等