SQLite с Entity Framework - PullRequest
       32

SQLite с Entity Framework

26 голосов
/ 02 июня 2009

У меня проблема с первичными ключами в Entity Framework при использовании SQLite. SQLite хочет получить явный NULL в списке VALUES в столбце первичного ключа с автоинкрементом. На самом деле я не смотрел на сгенерированный SQL в контексте EF, но я полагаю, что он идет в соответствии с обычным соглашением SQL Server об отсутствии значения для автоинкрементного столбца.

В соответствии с сайтом для поставщика ADO.NET SQLite, EF полностью поддерживается, но я не вижу там никакой помощи. Есть ли способ заставить EF явно вставить NULL для значения первичного ключа?

Ответы [ 6 ]

18 голосов
/ 04 июня 2009

Ну, я наконец-то сделал эту работу: D. Вам нужно установить столбец id как автоинкремент, таким образом он работает с EF. Не спрашивайте меня, почему это не упоминается в вопросе об автоинкременте в sqlite faq. Это пример:

create table Persona ( PersonaID integer primary key autoincrement, Nombre text)

Кроме того, я не нашел способа установить это из Visual Studio, я должен был сделать это из инструмента командной строки.

ОБНОВЛЕНИЕ: следующий код работает нормально.

PruebaDBEntities data = new PruebaDBEntities();

        foreach (int num in Enumerable.Range(1, 1000))
        {
            Persona p = new Persona() { Nombre = "Persona " + num, Edad = num };

            data.AddToPersona(p);

            data.SaveChanges();

            Console.WriteLine(p.PersonaID);
        }

PersonaID не был установлен, и после операции сохранения ему присваивалось значение sqlite.

13 голосов
/ 20 июня 2010

Ура ... Я нашел решение!

  1. Объявите столбец ID как INTEGER PRIMARY KEY AUTOINCREMENT в операторе создания таблицы. INTEGER PRIMARY KEY не сработает!
  2. Обновите модель Entity Framework в Visual Studio, установите для свойства столбца ID StoreGeneratedPattern значение "Вычислено"
5 голосов
/ 10 июня 2012

Вы должны установить автоинкремент в True. Вы можете сделать это непосредственно из VS , нажав значок (Управление индексами и ключами) на панели инструментов, пока вы находитесь в окне таблицы параметров, а затем обновите модель.

image

3 голосов
/ 07 июля 2009

У меня была такая же проблема с EF и SQLite. Попробуйте проверить второй пост: http://sqlite.phxsoftware.com/forums/p/1418/6162.aspx

Причиной моей проблемы было то, что автоинкремент был добавлен в саму базу данных, но модель сущностей не была обновлена ​​должным образом. Поэтому после обновления мое поле выглядело примерно так:

<Property Name="ID" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" />

( StoreGeneratedPattern = "Identity" добавлено)

Перед обновлением (со старой моделью) я просто попытался установить для свойства id значение 0, что также сработало:)

1 голос
/ 12 ноября 2010

Из книги «Полное руководство по SQLite» я прочитал следующее при ограничениях первичного ключа:

"В действительности, однако, этот столбец будет просто псевдонимом для ROWID. Все они будут ссылаться на одно и то же значение."

Я полагаю, что это является причиной необходимости установки AUTOINCREMENT в определении столбца.

0 голосов
/ 24 июля 2017

Похоже, что поставщик EF для SQLite не воспринимает столбец как идентификатор (автоинкремент).

Для базы данных сначала щелкните правой кнопкой мыши столбец в конструкторе EDMX и установите StoreGeneratedPattern на Identity.

...