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

时间:2011-08-19 15:16:46

标签: unicode entity-framework-4.1 dbcontext

我以为我会尝试新的DbContext在EF 4.1中做事的方式,但遇到了问题。

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

当我尝试获取名为Länder的表时,我得到了一个异常。

var db = new MyEntities();  // instantiate DbContext subclass
var countries = db.Länder.ToList();  // boom

EntitySqlException:简单标识符“Länder”必须仅包含基本的拉丁字符。要使用UNICODE字符,请使用转义标识符。

如果尝试使用拉丁名字的其他表 - 一切都很好。我在使用ObjectContext时没有这个问题。

我该如何逃避表名?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

我们(EF团队)调查并发现,当我们引导DbSets时,我们没有正确地转义(即添加方括号)实体集的名称。

非常感谢您举报此事!

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

使用Database First或Model First时,可以通过编辑设计器中的实体集名称来完成。使用Code First时,可以通过更改DbSet属性的名称来完成:

    public DbSet<Länder> Lander { get; set; }

或在上下文中覆盖OnModelCreating:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Länder>().HasEntitySetName("Lander");
    }

答案 2 :(得分:1)