Oracle
 sql >> Datenbank >  >> RDS >> Oracle

EF-Abfrage an Oracle löst ORA-12704 aus:Zeichensatzkonflikt

Am Ende habe ich den Autor davon (ODP.Net Managed Driver - ORA-12704:Zeichensatzkonflikt im generierten Code) dazu gebracht, die Frage zu aktualisieren. Er hat eine Problemumgehung mit einem Interceptor gepostet. Ich werde hier etwas detaillierter darauf eingehen. .

Zuerst habe ich meinen DBContext dekoriert, um eine Konfiguration zu laden. Sie können dies überspringen und einfach zu Ihrer Konfiguration hinzufügen, falls Sie eine haben:

[DbConfigurationType(typeof(MyDbConfiguration))]
public partial class MyContext : DbContext

Erstellen Sie die Konfigurationsklasse:

public class MyDbConfiguration : DbConfiguration
{
    public MyDbConfiguration()
    {
        this.AddInterceptor(new NVarcharInterceptor()); //add this line to existing config.
    }
}

Erstellen Sie als Nächstes den Abfangjäger:

public class NVarcharInterceptor : IDbCommandInterceptor
{
    public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
    {
        if (command != null && !string.IsNullOrWhiteSpace(command.CommandText))
            command.CommandText = command.CommandText.Replace("N''", "''");
    }

    public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
    {
        if (command != null && !string.IsNullOrWhiteSpace(command.CommandText))
            command.CommandText = command.CommandText.Replace("N''", "''");
    }

    public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
        if (command != null && !string.IsNullOrWhiteSpace(command.CommandText))
            command.CommandText = command.CommandText.Replace("N''", "''");
    }

    public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
        if (command != null && !string.IsNullOrWhiteSpace(command.CommandText))
            command.CommandText = command.CommandText.Replace("N''", "''");
    }

    public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
    {
        if (command != null && !string.IsNullOrWhiteSpace(command.CommandText))
            command.CommandText = command.CommandText.Replace("N''", "''");
    }

    public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
    {
        if (command != null && !string.IsNullOrWhiteSpace(command.CommandText))
            command.CommandText = command.CommandText.Replace("N''", "''");
    }
}