Проблема с именем таблицы Unicode в DbContext в Entity Framework 4.1 - PullRequest
1 голос
/ 19 августа 2011

Я думал, что попробую новый способ 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 ]

2 голосов
/ 26 августа 2011

Мы (команда 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 голосов
/ 20 августа 2011

Это похоже на ошибку в DbContext API, потому что внутренне запрос преобразуется в объектный SQL, который анализируется, и если идентификатор содержит национальные / юникодные символы, он должен экранироваться [Länder], но это не так. Это то, что вы, вероятно, не можете контролировать из своего кода.

Я категорически против использования неанглийских имен для идентификаторов (как кода, так и базы данных), так что это еще одна причина, почему это оказывается неверной идеей.

1 голос
/ 16 января 2012

Эта ошибка исправлена ​​в 4.3 http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-beta-1-released.aspx

...