SQLite с платформой Entity Framework
У меня проблема с первичными ключами в Entity Framework при использовании SQLite. SQLite хочет получить явный NULL в списке VALUES в столбце первичного ключа автоинкремент. Я действительно не смотрел на сгенерированный SQL в контексте EF, но я считаю, что это происходит с обычным соглашением SQL Server, не предоставляющим значение для столбца автоинкремент.
В соответствии с сайтом для провайдера SQLite ADO.NET, EF полностью поддерживается, но я не нашел там никакой помощи. Есть ли способ заставить EF явно вставить NULL для значения первичного ключа?
Ответы
Ответ 1
Хорошо, я, наконец, сделал эту работу: D. Вам нужно установить столбец идентификатора как автоинкремент, так как он работает с EF. Не спрашивайте меня, почему это не упоминается в вопросе об автоинкрементах в sqlite faq. Это пример:
create table Persona ( PersonaID integer primary key autoincrement, Nombre text)
Кроме того, я не нашел способ установить это из Visual Studio, я должен был сделать это из инструмента командной строки.
UPDATE: следующий код работает нормально.
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 не был установлен, и после операции сохранения он получил значение asigned sqlite.
Ответ 2
Ура... Я нашел решение!
- Объявите столбец идентификатора как INTEGER PRIMARY KEY AUTOINCREMENT в инструкции create table. INTIMER PRIMARY KEY не будет работать!
- Обновите модель Entity Framework в Visual Studio, установите для свойства столбца ID StoreGeneratedPattern значение "Вычислено"
Ответ 3
Вы должны установить для параметра автоинкремент значение True. Вы можете сделать это прямо из VS, щелкнув значок ( "Управление указателями и ключами" ) на панели инструментов, когда вы находитесь в окне таблицы дизайна, затем обновите свою модель.
![image]()
Ответ 4
У меня была такая же проблема с EF и SQLite.
Попробуйте проверить второй пост:
http://sqlite.phxsoftware.com/forums/p/1418/6162.aspx
Причиной моей проблемы было то, что автоинкремент был добавлен в базу данных, но модель объекта не была должным образом обновлена. Поэтому после обновления мое поле выглядело примерно так:
<Property Name="ID" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" />
(StoreGeneratedPattern = "Identity" )
Перед обновлением (со старой моделью) я просто попытался установить свойство id равным 0:)
Ответ 5
Из книги "Окончательное руководство по SQLite" я прочитал следующее по ограничениям первичного ключа:
"В действительности, однако, этот столбец будет просто псевдонимом для ROWID. Все они будут ссылаться на одно и то же значение."
Я считаю, что это причина необходимости устанавливать AUTOINCREMENT в определении столбца.
Ответ 6
Кажется, что поставщик EF для SQLite не подбирает столбец как личность (автоинкремент).
Сначала для базы данных щелкните правой кнопкой мыши столбец в дизайнере EDMX и установите StoreGeneratedPattern
в Identity
.