1

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

我从数据库(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 时没有这个问题。

我应该如何转义表名?

4

3 回答 3

2

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

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

于 2011-08-20T11:43:37.173 回答
2

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

非常感谢您报告此事!

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

当使用数据库优先或模型优先时,这可以通过在设计器中编辑实体集名称来完成。使用 Code First 时,可以通过更改 DbSet 属性的名称来完成:

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

或通过在上下文中覆盖 OnModelCreating :

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Länder>().HasEntitySetName("Lander");
    }
于 2011-08-25T23:10:17.433 回答
1

此错误已在 4.3 http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-beta-1-released.aspx中修复

于 2012-01-16T01:26:49.400 回答