Как предотвратить Entity-Framework для генерации N '..' строки с префиксом Unicode? - PullRequest
3 голосов
/ 31 июля 2011

Я использую EF 4.1 Code-First,
проблема в том, что EF генерирует все поля Unicode с префиксом N '..' по умолчанию. как это : exec sp_executesql N'SELECT ... FROM ... WHERE [Title] LIKE @p__linq__0 ESCAPE N''~''', N'@p__linq__0 nvarchar(4000)', @p__linq__0=N'%...%'

но это вызывает у меня некоторые проблемы у некоторых персонажей. Я хочу знать, есть ли способ предотвратить добавление префикса N в EF или нет?

Ответы [ 2 ]

3 голосов
/ 31 июля 2011

Вы можете заключить строки в метод AsNonUnicode, как указано в http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.asnonunicode.aspx, это сгенерирует нормальные строки.

2 голосов
/ 17 сентября 2015

Другим решением будет использование CommandInterceptors и изменение результирующего SQL-запроса до его выполнения.

У меня были похожие проблемы с базой данных оракула и провайдером ODP.net. AsNonUnicode не решил мою проблему.

EF 6 предоставляет возможность перехватывать контекст с помощью IDbCommandInterceptor до и после того, как он выполняет операции ExecuteNonQuery, ExecuteScalar, ExecuteReader с базой данных. Вам нужно будет настроить перехватчик, используя конфигурационный файл или конфигурацию на основе кода.

Файл конфигурации:

<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);
    }
}
...