次のエラーが表示されます。
System.Data.DataException: データベースの初期化中に例外が発生しました。詳細については、InnerException を参照してください。---> System.Data.EntitySqlException: 'All' は予約済みのキーワードであり、エスケープしない限りエイリアスとして使用できません。行 1、列 1 付近。 System.Data.Common.EntitySql.CqlParser.yylex() の System.Data.Common.EntitySql.CqlParser.yyparse() の yylex() System.Data.Common.EntitySql.CqlParser.Parse(String query) の System. System.Data.Common.EntitySql.CqlQuery.CompileCommon(String commandText,
...<中略>...
System.Data.Entity.Infrastructure.DbQuery
1.System.Linq.IQueryable.get_Provider() at System.Linq.Queryable.Where(IQueryable
1 ソース、Expression`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()
orのどこでもTranslateInlineQueryOfT
) が予約語を自動的にエスケープしないのはなぜですか?
この問題を解決する方法はありますか? クラス名の変更はハックです。
(MS SQL 2008 R2 に対して、.NET 4、EF 4.1 でコード ファーストを実行します。)