我以为我会尝试新的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时没有这个问题。
我该如何逃避表名?
答案 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)