【问题标题】:How can I use a sql reserved keyword in the name of a property in an entity framework data context?如何在实体框架数据上下文中的属性名称中使用 sql 保留关键字?
【发布时间】: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.Group LINQ 语法来查看它是否会偷偷溜走?如果您可以解释为什么不能重命名它可能会有所帮助?
  • 谢谢,是的,我不能更改名称的原因不是技术性的,所以我认为他们在这里不会有帮助。顺便说一句,还有其他我可以调用它的东西会导致相同的异常,例如“Using, As, Select”所以我很想知道在我使用这个事实之前是否可以不重命名该属性如果您明白我的意思,这不是更改它的原因(以及您提到的其他原因):-)
  • 重复一遍:您是否尝试过完整的var e = FROM a in ctx.Group LINQ 语法来查看它是否偷偷通过?从理论上讲,它在后台创建了相同的 IL,但值得一试。
  • 如果 EF 在这里抛出错误,我认为这是 EF 中的一个错误。任何 ORM 都应该为对象/列名提供正确的转义,这通常意味着 TSQL 中有很多 [ / ] (不确定 ESQL,我对该方言不太流利;编辑 - 我已经确认 @ 987654326@ / ] 确实可以解决这个问题)。 IMO 这应该可以工作;你的期望是合理的。
  • @HiTechMagic 我不同意——这里的命名取决于应用程序;在 LINQ 中,group 是一个 contextual 关键字,而不是 reserved 关键字,因此永远不会引起问题,而且 C# 甚至为此提供了 @ 转义。坦率地说,我认为这是一个 EF 错误。

标签: c# .net poco code-first entity-framework-4.3


【解决方案1】:

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

Update-Package EntityFramework

【讨论】:

  • 非常感谢!我更新到 4.3.1(我在 4.3 上)并且运行良好。
【解决方案2】:

因此,经过一段时间的研究,我得出结论,我的问题的答案是不可能的。

这不是什么大问题,因为我可以重命名该属性,但我认为它应该“正常工作”,所以我提出了一个 MS 连接问题,可以在这里找到:Using a sql reserved keyword as the name of a collection on a DbContext causes an exception。如果这得到解决或被拒绝,因为实际上有可能我会更新这个答案。

【讨论】:

    【解决方案3】:

    您总是可以将其设为复数,例如 Groups 将其设为“非保留”词。

    【讨论】:

    • 谢谢,是的,我的问题是如何在不更改属性名称的情况下绕过它,但我认为实际答案是“你不能 - 这是实体框架中的一个错误”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    相关资源
    最近更新 更多