当查询提供程序将ELINQ查询编译为ESQL时,类名是保留字

时间:2011-11-16 11:10:48

标签: c# sql-server-2008 entity-framework-4.1 reserved-words entity-sql

我收到此错误:

  

System.Data.DataException:初始化时发生异常   数据库。有关详细信息,请参阅InnerException。 --->   System.Data.EntitySqlException:'All'是保留关键字,但不能   用作别名,除非它被转义。靠近第1行,第1列   System.Data.Common.EntitySql.CqlLexer.MapUnescapedIdentifier(字符串   符号)   System.Data.Common.EntitySql.CqlLexer.MapIdentifierOrKeyword(字符串   符号)在System.Data.Common.EntitySql.CqlLexer.yylex()at   System.Data.Common.EntitySql.CqlParser.yylex()at   System.Data.Common.EntitySql.CqlParser.yyparse()at   System.Data.Common.EntitySql.CqlParser.Parse(String query)at   System.Data.Common.EntitySql.CqlQuery.Parse(String commandText,   ParserOptions parserOptions)at   System.Data.Common.EntitySql.CqlQuery.CompileCommon(字符串   commandText,Perspective透视图,ParserOptions parserOptions,   Func`3 compilationFunction)at   System.Data.Objects.EntitySqlQueryState.Parse()at   System.Data.Objects.ELinq.ExpressionConverter.TranslateInlineQueryOfT(的ObjectQuery   inlineQuery)   System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter   parent,ConstantExpression linq)at   System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(表达式   LINQ)

     

...<剪断> ...

     

在   System.Data.Entity.Infrastructure.DbQuery 1.System.Linq.IQueryable.get_Provider() at System.Linq.Queryable.Where(IQueryable 1个源,表达式`1   谓词)在All.cs中的MyNamespace.All.GetEmptyList():   第35行

这似乎是由测试类的名称为“全部”引起的。

[TestClass]
public class All : Service
{
    [TestMethod]
    public void GetEmptyList()
    {
        var actualList = MyItems.Where(item => item.Id < 0);
    }
}

MyItems属性是Service基类的公共属性:

public IQueryable<MyItem> MyItems
{
    get { return Set<MyItem>(); }
}

我假设我的类名被转换为ESQL类型,将其转换为保留字。但是,我没有(直接)控制它,因为ESQL和TSQL不是我关注的问题,我不认为这个问题应该冒出来,特别是因为我看不出我能做些什么,分开从重命名我的班级(如果我将其改为'All2',一切正常。)

为什么表达式解析器(具体而言,可能是ExpressionConverter.Convert()TranslateInlineQueryOfT)不能自动转义保留字?

有没有办法解决这个问题?更改类名是一个黑客。

(使用.NET 4,EF 4.1,针对MS SQL 2008 R2运行代码优先。)

1 个答案:

答案 0 :(得分:0)

实际上改变班级名称对于理解是一个巨大的帮助。

所有什么?

实体框架是通用的,它从哪里获得保留字的列表和方式。 如果有修复,我怀疑它将是一个属性,可以转义或映射类名以便在后端使用。无论如何,这就是我的方式。