1

我收到此错误:类名是保留字时查询提供编译ELINQ查询ESQL

System.Data.DataException: An exception occurred while initializing the database. See the InnerException for details. ---> System.Data.EntitySqlException: 'All' is a reserved keyword and cannot be used as an alias, unless it is escaped. Near line 1, column 1. at System.Data.Common.EntitySql.CqlLexer.MapUnescapedIdentifier(String symbol) at System.Data.Common.EntitySql.CqlLexer.MapIdentifierOrKeyword(String symbol) at 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(String commandText, Perspective perspective, ParserOptions parserOptions, Func`3 compilationFunction) at System.Data.Objects.EntitySqlQueryState.Parse() at System.Data.Objects.ELinq.ExpressionConverter.TranslateInlineQueryOfT(ObjectQuery inlineQuery) at System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter parent, ConstantExpression linq) at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)

...< snip >...

at System.Data.Entity.Infrastructure.DbQuery 1.System.Linq.IQueryable.get_Provider() at System.Linq.Queryable.Where(IQueryable 1 source, Expression`1 predicate) at MyNamespace.All.GetEmptyList() in All.cs: line 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。)

回答

0

实际上改变的是类的名称将是可理解一个巨大的帮助。

所有什么?

实体框架是通用的,它将从何处获得保留字列表以及如何执行。 如果有修复,我怀疑它是一个属性,可以逃避或映射后端使用的类名。无论如何,这是我做这件事的方式。

+0

在更广阔的背景下,“全部”很清楚,我刚刚离开了它。然而,我明白你的观点,因为有一个提供者(这里是System.Data.SqlClient),它可以实现这个功能。此外,默认情况下转义会确保避免这些问题?这是ORM的烦人方面之一,它们不是存储不可知的。将db-backing更改为内存中的集合不会引发问题 - 这表明ESQL本身中的'UNION'语句不是问题,而是TSQL之一。 – nicodemus13

+0

Nah它不是TSQL,如果你是原生的,它将是[ALL],ORM中的某些东西应该将所有东西都包装在DBMS用来包装'object'名称中 –

+0

将后备存储更改为内存将无济于事在这里,我意识到。如果它不是TSQL,那么在我看来它应该被自动处理(甚至可能是TSQL)。 – nicodemus13