另一种解决方案是使用 CommandInterceptors 并在执行之前修改生成的 sql 查询。
我在使用 oracle 数据库和 ODP.net 提供程序时遇到了类似的问题。AsNonUnicode 没有解决我的问题。
EF 6 提供了在对数据库执行 ExecuteNonQuery、ExecuteScalar、ExecuteReader 操作之前和之后使用 IDbCommandInterceptor 拦截上下文的能力。您将需要使用配置文件或基于代码的配置来配置拦截器。
配置文件:
<entityFramework>
<interceptors>
<interceptor type="EfSample.EfCommandInterceptor, EfSample">
</interceptor>
</interceptors>
</entityFramework>
基于代码的配置:
public sealed class EntityFrameworkConfiguration : DbConfiguration
{
public EntityFrameworkConfiguration ()
{
this.AddInterceptor(new EfCommandInterceptor());
}
}
创建 CommandInterceptor,如下所示:
public sealed class EfCommandInterceptor
: DbCommandInterceptor
{
/// <summary>
/// Called when Reader is executing.
/// </summary>
/// <param name="command"></param>
/// <param name="interceptionContext"></param>
/// <inheritdoc />
public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
if(command.CommandText.Contains("N''"))
{
command.CommandText = command.CommandText.Replace("N''", "''");
}
base.ReaderExecuting(command, interceptionContext);
}
}