我收到此错误:
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运行代码优先。)
答案 0 :(得分:0)
实际上改变班级名称对于理解是一个巨大的帮助。
所有什么?
实体框架是通用的,它从哪里获得保留字的列表和方式。 如果有修复,我怀疑它将是一个属性,可以转义或映射类名以便在后端使用。无论如何,这就是我的方式。