如何在实体框架数据上下文中使用SQL保留关键字作为属性名称?

9
以下代码抛出异常 "EntitySqlException: 'Group' 是保留关键字,除非转义,否则不能用作别名。位于第1行,第11列附近"。
我的问题首先是,我选择的数据上下文中的集合名称与生成的 SQL 查询似乎有什么关系?
其次,除了在上下文中重命名属性之外,是否还有其他解决方法(我知道这个名称很愚蠢,但有些原因我不能更改名称,我不会在这里详细说明)?
也许可以通过 modelBuilder 做些什么?
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);
}

2
你已经意识到这个名称很愚蠢,所以加一分 :) Group既是一个通用术语(而不是与其持有的数据相关),也是LINQ的保留字。你尝试过完整的var e = FROM a in ctx.Group LINQ语法来看是否可以通过吗?如果你能够解释为什么不能重命名它,那可能会有所帮助。 - iCollect.it Ltd
谢谢,是的,我不能更改名称的原因不是技术性的,所以我认为它们在这里没有帮助。顺便说一下,我可以称它为其他一些东西,例如“Using,As,Select”,这将导致相同的异常,因此我只是想知道在使用它不是更改它的原因之一(以及您提到的其他原因)之前,是否有可能不重命名该属性,如果你明白我的意思 :-) - kmp
4
如果EF在这里抛出一个错误,我认为这是EF的一个错误。任何ORM都应该为对象/列名称提供正确的转义,这通常意味着在TSQL中使用许多[ / ](对于ESQL不太确定,我对这种方言不太熟悉;编辑 - 我已确认使用[ / ]确实可以解决此问题)。我认为这应该可以正常工作;你的期望是合理的。 - Marc Gravell
1
@HiTechMagic 我不同意 - 这里的命名取决于应用程序; 在LINQ中,group是一个上下文关键字,而不是保留关键字,因此不应该引起问题,此外C#甚至为此提供了@转义。坦率地说,我认为这是一个EF的错误。 - Marc Gravell
@HiTech Magic 抱歉,不,这样做并不意味着它会悄悄通过。 - kmp
显示剩余4条评论
3个回答

1

这个问题在EF 4.3.1和EF 5.0 beta1中已经修复。请使用NuGet将EntityFramework包更新到最新版本。例如,在程序包管理器控制台中运行:

Update-Package EntityFramework

非常感谢!我已经更新到4.3.1(之前是4.3),现在一切正常。 - kmp

1

经过一段时间的研究,我得出了结论,我的问题是无法解决的。

这并不是什么大问题,因为我可以重命名属性,但我认为这应该是“正常工作”的事情,所以我在 MS Connect 上提出了一个问题,链接在这里:在 DbContext 中使用 SQL 保留关键字作为集合名称会导致异常。如果这个问题得到解决或被拒绝,因为它实际上是可能的,我会更新这个答案。


更新: 已经解决。请查看接受的答案


0

你可以随时将其变成复数形式,例如Groups,以使其成为“非保留”单词。


谢谢,是的,我的问题是如何在不更改属性名称的情况下解决它,但我认为实际答案是“你不能 - 这是实体框架中的一个错误”。 - kmp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接