如何使用Entity Framework处理varchar列?

7

我有一个表,其中有一个varchar列,我正在使用Entity Framework在WHERE子句中使用此列。

Entity Framework生成的查询带有N'',因此无法使用列上的索引。 有没有办法强制Entity Framework生成varchar查询而不是nvarchar查询?

2个回答

7
实际上这取决于您如何构建EF模型,如果您使用其设计工具,则可以为每个列指定所需的数据类型(在您的情况下,只需设置varchar即可)。
如果您采用代码优先方法,则必须使用适当的属性装饰该列的属性(.NET中的string对象始终是Unicode,因此默认情况下将映射nvarchar),只需执行以下操作(使用数据注释,如果使用StringAttribute,则将其IsUnicode属性设置为false)。
[Column(TypeName = "varchar")]
public string YourColumnName
{
    get;
    set;
}

在EDMX中,我已经正确设置了列的类型(char)和长度(6)。我还添加了额外的元数据类,并使用Column(TypeName = "char")]和StringLength属性装饰了属性。然而,我看到奇怪的代码执行SELECT TOP(2)和varchar(8000)参数。如何解决? - Naomi
@Naomi,根据提供的信息无法回答你的问题。请将其发布为新问题,并别忘了在您的类声明中包含相关部分和执行生成此SQL的代码! - Adriano Repetti
也许我明天会添加一个新问题。实际上,我已经在 MSDN 上提出了这个问题:http://social.msdn.microsoft.com/Forums/vstudio/en-US/696f5fd6-d10f-40d3-82d2-feea806965cc/two-same-classes-how-to-add-attributes-to-the-property?forum=csharpgeneral - Naomi
我在MyContext.OnModelCreating中使用了流畅的语法:var myTable = modelBuilder.Entity<MyEntityType>(); myTable.Property(x => x.TextField).HasColumnType("varchar(8)"); - Rossco

5

您可以使用EntityFunctions.AsNonUnicode(string)方法,这样EF就不会将字符串值传递为nvarchar。我在使用EF 5和EDMX时遇到了相同的问题,其中Oracle数据库忽略了varchar2列索引,这对我很有帮助。

var q = (from TableClass t in TableName
         where t.varchar2Column == EntityFunctions.AsNonUnicode(someText));

MSDN参考文献:https://msdn.microsoft.com/pt-br/library/system.data.objects.entityfunctions(v=vs.110).aspx

这个网页是关于Microsoft .NET Framework中Entity Framework的EntityFunctions类的说明。该类提供了一组可用于查询表达式中的常规数学函数和日期时间函数的静态方法。使用这些方法可以在LINQ to Entities查询中进行转换、聚合、比较和处理数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接