类名是查询提供程序将 ELINQ 查询编译为 ESQL 时的保留字
我收到此错误:
System.Data.DataException:初始化时发生异常 数据库。有关详细信息,请参阅内部异常。 ---> System.Data.EntitySqlException:“All”是保留关键字,不能 用作别名,除非它被转义。靠近第 1 行第 1 列。位于 System.Data.Common.EntitySql.CqlLexer.MapUnescapedIdentifier(字符串 符号)在 System.Data.Common.EntitySql.CqlLexer.MapIdentifierOrKeyword(字符串 符号)位于 System.Data.Common.EntitySql.CqlLexer.yylex() 处 System.Data.Common.EntitySql.CqlParser.yylex() 在 System.Data.Common.EntitySql.CqlParser.yyparse() 在 System.Data.Common.EntitySql.CqlParser.Parse(字符串查询)位于 System.Data.Common.EntitySql.CqlQuery.Parse(字符串commandText, ParserOptions 解析器选项)位于 System.Data.Common.EntitySql.CqlQuery.CompileCommon(字符串 commandText、Perspective 透视图、ParserOptions parserOptions、 Func`3 编译函数) at System.Data.Objects.EntitySqlQueryState.Parse() 在 System.Data.Objects.ELinq.ExpressionConverter.TranslateInlineQueryOfT(ObjectQuery 内联查询)位于 System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter 父级,ConstantExpression linq) at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(表达式 林克)
...<剪断>...
在 System.Data.Entity.Infrastruct.DbQuery
1.System.Linq.IQueryable.get_Provider() 在 System.Linq.Queryable.Where(IQueryable
1 源,表达式`1 谓词)位于 All.cs 中的 MyNamespace.All.GetEmptyList() 处: 第35行
似乎是由测试类的名称为“All”引起的。
[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 运行代码优先。)
I'm receiving this error:
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.DbQuery1.System.Linq.IQueryable.get_Provider()
1 source, Expression`1
at System.Linq.Queryable.Where(IQueryable
predicate) at MyNamespace.All.GetEmptyList() in All.cs:
line 35
which seems to be caused by the name of the test class being 'All'.
[TestClass]
public class All : Service
{
[TestMethod]
public void GetEmptyList()
{
var actualList = MyItems.Where(item => item.Id < 0);
}
}
The MyItems
property is a public property on the Service
base class:
public IQueryable<MyItem> MyItems
{
get { return Set<MyItem>(); }
}
I presume that my class name is being converted into an ESQL type, which turns it into a reserved word. However, I have no (direct) control over that, and as the ESQL and TSQL is not my concern, I don't think this problem should bubble-up, especially as I don't see what I can do about it, apart from rename my class (if I change it to 'All2', everything works fine.)
Why doesn't the expression parser (whereever specifically, maybe ExpressionConverter.Convert()
or TranslateInlineQueryOfT
) automatically escape reserved words?
Is there a way way I can fix this problem? Changing the class name is a hack.
(Running code-first with .NET 4, EF 4.1, against MS SQL 2008 R2.)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
实际上改变类名将会对理解有很大的帮助。
全部什么?
实体框架是通用的,它从哪里获取保留字列表以及如何获取。
如果有修复,我怀疑它将是转义或映射类名以供后端使用的属性。无论如何,这就是我会做的方式。
Actually changing the class name would be a huge aid to comprehensibility.
All what?
The entity framework is generic, where would it get a list of reserved words from and how.
If there is a fix I suspect it will be an attribute to either escape or map the class name for use in the back end. It's the way I'd do it anyway.