在实体框架中,我有一个从数据库生成的实体“客户端”。有一个名为“帐户”的属性,它在存储模型中定义为:
<Property Name="Account" Type="char" Nullable="false" MaxLength="6" />
在概念模型中:
<Property Name="Account" Type="String" Nullable="false" />
使用Account的变量生成select语句时,即
where m.Account == myAccount...
实体框架使用NVarchar(6)类型的参数生成参数化查询。问题是表中的列是char(6)的数据类型。执行此操作时,由于数据类型不同,性能会受到很大影响。帐户是表上的索引,而不是使用索引,我相信索引扫描已完成。
任何人都知道如何强制EF不使用Unicode作为参数并使用Varchar(6)代替?
答案 0 :(得分:2)
我想我找到了自己问题的答案。这里http://blogs.msdn.com/b/adonet/archive/2010/05/10/improvements-to-generated-sql-in-net-4-0.aspx
它讨论了在EF 4.0中生成sql的改进。特别是它说
提供有效的非Unicode查询机制 列
在.NET 3.5中,每当一个常量或一个 参数在LINQ to Entities中使用 查询,我们将其视为Unicode。 因此,在比较常数时 存储在非unicode中的属性 SQL Server上的列,如果有的话 该列的索引,它不是 正在使用。
为了解决这个问题,我们现在生成 非unicode常量和参数 当这些在LINQ中使用时 实体查询与比较 非unicode列。
我想我需要升级。
答案 1 :(得分:1)
该字段的属性窗口有3个属性可以满足您的要求,固定长度,最大长度和Unicode,当您在设计器中选择适当的字段时,它们位于属性窗口的Facets组中。 / p>
我目前正在关注EF4,我不确定它们是否存在于以前版本的EF中。
它最终应该在XML中看起来像这样。
<Property Name="Account" Type="String" MaxLength="6" Unicode="false" FixedLength="true" Nullable="false" />