实体框架4.1中DbContext的Unicode表名问题

实体框架4.1中DbContext的Unicode表名问题,unicode,entity-framework-4.1,dbcontext,Unicode,Entity Framework 4.1,Dbcontext,我本想尝试EF4.1中新的DbContext方法,但遇到了一个问题 我从数据库(SQLServer2008)生成一个新的实体数据模型,然后使用DbContext生成器 当我试图取回名为Länder的表时,我遇到了一个异常 var db = new MyEntities(); // instantiate DbContext subclass var countries = db.Länder.ToList(); // boom EntitySqlException:简单标识符“州”只能包含

我本想尝试EF4.1中新的DbContext方法,但遇到了一个问题

我从数据库(SQLServer2008)生成一个新的实体数据模型,然后使用DbContext生成器

当我试图取回名为Länder的表时,我遇到了一个异常

var db = new MyEntities();  // instantiate DbContext subclass
var countries = db.Länder.ToList();  // boom
EntitySqlException:简单标识符“州”只能包含基本拉丁字符。要使用UNICODE字符,请使用转义标识符

如果尝试使用拉丁名称的其他表格,则一切正常。我在使用ObjectContext时没有这个问题


我应该如何转义表名?

它看起来像DbContext API中的一个bug,因为在内部,查询被转换为实体SQL,该实体SQL被解析,如果标识符包含国家/unicode字符,则必须转义
[Länder]
,但它不是。这可能是您无法从代码中控制的


我强烈反对使用非英语名称作为标识符(代码和数据库)所以这只是它被证明是一个错误想法的另一个原因。

它看起来像是DbContext API中的一个bug,因为在内部,查询被转换为实体SQL,并被解析,如果标识符包含国家/unicode字符,则必须转义
[Länder]
,但实际上不是。这可能是您无法从代码中控制的

我强烈反对使用非英语名称作为标识符(代码和数据库),因此这只是证明这是错误想法的另一个原因。

我们(EF团队)调查发现,在引导数据库集时,我们没有正确地为实体集的名称转义(即添加方括号)

非常感谢您的报道

我们目前正在测试一个应该包含在未来版本中的修复程序。同时,您应该能够通过显式指定实体集名称来解决此问题,使其不包含任何需要转义的字符

首先使用数据库或先使用模型时,可以通过在设计器中编辑实体集名称来完成此操作。首先使用代码时,可以通过更改DbSet属性的名称来完成:

    public DbSet<Länder> Lander { get; set; }
公共数据库集着陆器{get;set;}
或者通过在上下文中重写OnModelCreating:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Länder>().HasEntitySetName("Lander");
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().HasEntitySetName(“Lander”);
}
我们(EF团队)进行了调查,发现在引导数据库集时,实体集的名称没有正确转义(即添加方括号)

非常感谢您的报道

我们目前正在测试一个应该包含在未来版本中的修复程序。同时,您应该能够通过显式指定实体集名称来解决此问题,使其不包含任何需要转义的字符

首先使用数据库或先使用模型时,可以通过在设计器中编辑实体集名称来完成此操作。首先使用代码时,可以通过更改DbSet属性的名称来完成:

    public DbSet<Länder> Lander { get; set; }
公共数据库集着陆器{get;set;}
或者通过在上下文中重写OnModelCreating:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Länder>().HasEntitySetName("Lander");
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().HasEntitySetName(“Lander”);
}
此错误在4.3中已修复

此错误已在4.3中修复

禁止使用非英语名称难道不等于要求使用英语名称吗?要求母语为其他语言的人使用英语难道不是一种文化帝国主义吗?也许有一些压倒性的理由要求这样做,但这似乎不公平。@tchrist:也许这似乎不公平,但它使代码国际化,并为全球每个开发人员所理解。你永远不知道还有谁会使用你的代码,所以在你的运营商中尽早开始使用英语命名约定是必须的。至少被动英语是绝对必要的技能,所以从英文名字开始只是一个好的开始。语言的关键字也没有本地化。。。顺便说一句,我不是来自讲英语的国家来说明这一点的。我很确定你不是来自一个姓这样的英语国家。:)你能告诉我你的姓怎么用IPA符号发音吗?这是一个以R或N为音节中心的双音节单词吗?谢谢你的回答。如果它是一个bug,我想我只能回到ObjectContext。只要可能,我只使用英语,但这是一个遗留数据库,我没有命名控制。然而,有时我确实觉得,翻译特定领域的术语可能会变得非常复杂,而这些术语可能没有合适的英语对应词(例如在金融和司法领域)。但是,即使我使用非英语语言,我也尽量避免使用非英语字符。禁止使用非英语名称难道不等于要求使用英语名称吗?要求母语为其他语言的人使用英语难道不是一种文化帝国主义吗?也许有一些压倒性的理由要求这样做,但这似乎不公平。@tchrist:也许这似乎不公平,但它使代码国际化,并为全球每个开发人员所理解。你永远不知道还有谁会使用你的代码,所以在你的运营商中尽早开始使用英语命名约定是必须的。至少被动英语是绝对必要的技能,所以从英文名字开始只是一个好的开始。语言的关键字也没有本地化。。。顺便说一句,我不是来自讲英语的国家来说明这一点的。我很确定你不是来自一个姓这样的英语国家。:)你能告诉我你的姓怎么用IPA符号发音吗?它是一个双音节单词,其中R或N构成音节中心吗