Сгенерированные сервером ключи и сгенерированные сервером значения не поддерживаются SQL Server Compact

compact-framework entity-framework

Вопрос

Я только начал играть со структурой сущностей, поэтому я решил подключить ее к моей существующей базе данных SQL Server CE. У меня есть таблица с первичным ключом IDENTITY (1, 1), но когда я попытался добавить объект, я получил вышеупомянутую ошибку.

Из MS Technet artice я узнал, что

SQL Server Compact не поддерживает объекты с генерируемыми сервером ключами или значениями, когда он используется с Entity Framework. При использовании Entity Framework ключи объекта могут быть помечены как сгенерированные сервером. Это позволяет базе данных генерировать значение для ключа при вставке или создании объекта. Кроме того, ноль или более свойств объекта могут быть помечены как сгенерированные сервером значения. Для получения дополнительной информации см. Раздел «Store Generated Pattern» в документации Entity Framework. SQL Server Compact не поддерживает объекты с ключами или значениями, сгенерированными сервером, когда он используется с Entity Framework, хотя Entity Framework позволяет определять типы объектов с помощью ключей или значений, генерируемых сервером. Операция манипулирования данными на объекте, который имеет сгенерированные сервером значения, вызывает исключение «Не поддерживается».

Итак, теперь у меня есть несколько вопросов:

  • Почему вы помечаете ключ как сгенерированный сервером, если он не поддерживается и выдает исключение? Трудно понять смысл цитируемого абзаца.
  • Когда я попытался добавить StoreGeneratedPattern = "Identity" в свойство моей сущности, Studio пожаловалась, что это запрещено. Что я делаю не так?
  • Как лучше всего обойти это ограничение (включая переключение на другую БД)? Мои ограничения - нулевая установка и использование структуры объекта.

Принятый ответ

Когда я достиг этого ограничения, я изменил тип на uniqueidentifier


Популярные ответы

Используйте uniqueidentifier или сгенерируйте значение ключа bigint / int вручную - ваш лучший вариант.

Что-то вроде этого возможно ...

    private static object lockObject = new object();

    private static long nextID = -1;

    public static long GetNextID()
    {
        lock (lockObject)
        {
            if (nextID == -1) nextID = DateTime.UtcNow.Ticks; else nextID++;
            return nextID;
        }
    }

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



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему