【发布时间】:2012-03-26 18:51:08
【问题描述】:
下面的代码抛出异常“EntitySqlException: 'Group' is a reserved keyword and cannot be used as a alias, unless it is escaped. Near line 1, column 11”。
我的问题首先是为什么我在数据上下文中选择的集合名称与生成的 sql 查询之间存在任何关系?
其次,除了在我的上下文中重命名属性之外,我还能做些什么来解决它(我知道这个名字很愚蠢,有一些原因我不能改变这个名字,就像我想的那样,我不会进入这里)?
也许我可以用模型构建器做些什么?
public class GroupEntity
{
public int GroupEntityId { get; set; }
public string Name { get; set; }
}
public class MyContext : DbContext
{
public MyContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{
Group = Set<GroupEntity>();
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<GroupEntity>().ToTable("GroupEntities");
base.OnModelCreating(modelBuilder);
}
public DbSet<GroupEntity> Group { get; private set; }
}
//...
using (var ctx = new MyContext("valid connection string"))
{
var e = ctx.Group.Count(a => a.GroupEntityId % 2 == 0);
// Exception thrown here
Console.WriteLine(e);
}
【问题讨论】:
-
你已经意识到这个名字很愚蠢,所以 +1 :) 组既是一个通用术语(而不是与它所拥有的数据相关),也是 LINQ 的保留字。您是否尝试过完整的
var e = FROM a in ctx.GroupLINQ 语法来查看它是否会偷偷溜走?如果您可以解释为什么不能重命名它可能会有所帮助? -
谢谢,是的,我不能更改名称的原因不是技术性的,所以我认为他们在这里不会有帮助。顺便说一句,还有其他我可以调用它的东西会导致相同的异常,例如“Using, As, Select”所以我很想知道在我使用这个事实之前是否可以不重命名该属性如果您明白我的意思,这不是更改它的原因(以及您提到的其他原因):-)
-
重复一遍:您是否尝试过完整的
var e = FROM a in ctx.GroupLINQ 语法来查看它是否偷偷通过?从理论上讲,它在后台创建了相同的 IL,但值得一试。 -
如果 EF 在这里抛出错误,我认为这是 EF 中的一个错误。任何 ORM 都应该为对象/列名提供正确的转义,这通常意味着 TSQL 中有很多
[/](不确定 ESQL,我对该方言不太流利;编辑 - 我已经确认 @ 987654326@ /]确实可以解决这个问题)。 IMO 这应该可以工作;你的期望是合理的。 -
@HiTechMagic 我不同意——这里的命名取决于应用程序;在 LINQ 中,
group是一个 contextual 关键字,而不是 reserved 关键字,因此永远不会引起问题,而且 C# 甚至为此提供了@转义。坦率地说,我认为这是一个 EF 错误。
标签: c# .net poco code-first entity-framework-4.3