3

我使用 EF 4.1 Code-First ,
问题是:默认情况下,EF 生成所有带有 N'..' 前缀的 unicode 字段。像这样 : exec sp_executesql N'SELECT ... FROM ... WHERE [Title] LIKE @p__linq__0 ESCAPE N''~''', N'@p__linq__0 nvarchar(4000)', @p__linq__0=N'%...%'

但它在某些角色中给我带来了一些问题。我想知道是否有办法防止 EF 添加 N 前缀?

4

2 回答 2

3

您可以将字符串包装在 AsNonUnicode 方法中,如http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.asnonunicode.aspx中所述,这将生成正常字符串。

于 2011-07-31T10:54:29.897 回答
2

另一种解决方案是使用 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);
    }
}
于 2015-09-17T07:47:11.267 回答