Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/55: Рейтинг темы: голосов - 55, средняя оценка - 4.82
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
SQLite

Code First - выбор: Microsoft.EntityFrameworkCore.Sqlite, Microsoft.Data.Sqlite, System.Data.SQLite и др.

22.09.2021, 19:48. Показов 13182. Ответов 96
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Работаю с БД очень редко.
Поэтому опыт маленький и знания обрывочные.

Стоит задача в Решении Framework 4.8 создать репозиторий на SQLite для такого контекста (пример):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    [Table("Contacts")]
    public class ContactEntity
    {
        [Key]
        public int Id { get; set; }
 
        [Required]
        [Index]
        public string Name { get; set; }
    }
 
 
    [Table("Phones")]
    public class PhoneEntity
    {
        [Key]
        public int Id { get; set; }
 
        [Required]
        [Index]
        public int ContactId { get; set; }
 
        [Required]
        public string Title { get; set; }
 
        [Required]
        [Index]
        public string Number { get; set; }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
    public class ContactDB : DbContext
    {
        public ContactDB(????)
            : base(????)
        {
 
        }
        public DbSet<ContactEntity> Contacts { get; set; }
        public DbSet<PhoneEntity> Phones{ get; set; }
 
    }
Как работать с существующей БД я более-менее понимаю.

Хотелка: реализация Code-First, то есть после запуска приложения в новом расположении без БД, что бы автоматически она была создана.

Доп. хотелки:
1) Запись в новую базу каких-то начальных данных (для образца);
2) Сделать независимые контексты для каждой сущности. То есть они могут быть в разных БД или в одной, но в разных таблицах. Это определяется уже при использовании репозитория передачей разных (каких?) параметров в конструктор.

Не знаю:
1) Для SQLite есть несколько разных основных пакетов, а к ним ещё и дополнительные. Какие лучше использовать?
2) Что ещё нужно добавить в конструктор и переопределяемые методы для реализации этой задачи? И насколько я понимаю, в зависимости от используемого комплекта пакетов, код реализации контекста может быть разный?
3) Атрибута [Index] для SQLite я не нашёл. Я его не там искал или его у SQLite DBContext нет? Если нет то как решить проблему быстроного поиска по нужному значению?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.09.2021, 19:48
Ответы с готовыми решениями:

System.data.sqlite не существует!
Всем добра. Я в качестве базы данных выбрал sqlite. скачал с офф сайта sqlite studio и sqlite bundle. обе установил. но когда пишу ...

Почему нет SQLite в разделе System.DATA
Не могу понять как сделать. чтобы подключение к SQLite было в System.Data. Подскажите пожалуйста. А то приходится подключать using...

Как включить поддержку ICU в System.Data.SQLite ?
Это повтор моей темы из рассылки sqlite http://sqlite.1065341.n5.nabble.com/ Как включить поддержку ICU в System.Data.SQLite ? Мне...

96
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
27.09.2021, 23:52  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Usaga Посмотреть сообщение
Можете воспользоваться утилитой procmon.exe чтобы увидеть какие файлы открывает ваш процесс.
Первое впечатление, что никакой файл не открывает.....
Сейчас делаю полный сейф лога и по нему попробую текстом поискать.

Добавлено через 16 минут
Usaga, я не смог ничего найти этой утилитой.
Чё за чёрт?!
Дурдом какой-то....

Завтра на свежую голову, ещё покопаюсь, но пока даже проблеска мысли нет куда копать надо.
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
27.09.2021, 23:57
Элд Хасп, да просто сюда архив с проектов выложите)
1
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
28.09.2021, 00:58
Элд Хасп, Вы не ищете легких путей, только "мощь" EF, только хардкор.
Ну что же, ждите "много открытий чудных.."
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
28.09.2021, 08:04  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
да просто сюда архив с проектов выложите)
Выше давал ссылку на GitHub.

Вот архив: ChoosingPackages.7z

Цитата Сообщение от Элд Хасп Посмотреть сообщение
0
HF
 Аватар для HF
1337 / 921 / 202
Регистрация: 09.09.2011
Сообщений: 2,742
Записей в блоге: 2
28.09.2021, 08:36
Цитата Сообщение от Элд Хасп Посмотреть сообщение
"Тихо шифером шурша, крыша едет не спеша" - не могу найти где создаётся БД!
Она создаётся, в неё записываются элементы в тестовом коде.
Но по указанному пути её нет!
Давно я так не хихикал. По-доброму конечно.

А кто за вас будет делать?
C#
1
SQLiteConnection.CreateFile(dbName);
Разумеется ничего и не создавалось. А то что вы делали в коде, дак это же обычные модели и коллекции. Чего б им не создаваться и не вытаскиваться из коллекции.
Я лично был только одному удивлён - что SaveChanges "записывает" в память. Ну тут видимо фича, надо почитать про это. Видимо без файла - он работает в режиме InMemory.

Добавлено через 3 минуты
И ещё, удалять каталог - это вообще мне кажется какая-то жесть. Как вам это в голову пришло? В таких каталогах бывает помимо БД ещё много чего. Я даже сначала Debug\Bin сделал, дак чуть не обосрался от страха когда понял что могло произойти. Файл - да, его можно и удалить и потом создать.
2
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
28.09.2021, 09:24
Цитата Сообщение от HF Посмотреть сообщение
Видимо без файла - он работает в режиме InMemory.
Я тоже о таком раскладе подумал.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
28.09.2021, 10:58  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
И ещё, удалять каталог - это вообще мне кажется какая-то жесть.
Это для тестирования, чтобы проверить как создаётся не только база, но и весь путь.
Но эта часть сейчас всё равно не работает.
Код не выполняется независимо от выбора варианта, так как не существует искомого пути.


Цитата Сообщение от HF Посмотреть сообщение
Разумеется ничего и не создавалось. А то что вы делали в коде, дак это же обычные модели и коллекции. Чего б им не создаваться и не вытаскиваться из коллекции.
Я лично был только одному удивлён - что SaveChanges "записывает" в память. Ну тут видимо фича, надо почитать про это. Видимо без файла - он работает в режиме InMemory.
Ок.
Но по какой причине значения сохраняются между сеансами?

И даже если из bin скопировать сборку в другое местоположение, то данные занесённые в Debug Студии будут видны при запуске из другого расположения. И наоборот.


Цитата Сообщение от HF Посмотреть сообщение
SQLiteConnection.CreateFile(dbName);
Насколько я понимаю, это должен делать EF.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
28.09.2021, 11:20  [ТС]
Usaga, HF, для лучшего понимания внёс изменения в консольный тест.
На Гите зафиксировал.
Если удобнее архивом: ChoosingPackages.V2.7z


Вот скрин:


Как видите данные между сеансами сохраняются.
Значит это точно не в памяти.
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
28.09.2021, 11:25
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Насколько я понимаю, это должен делать EF.
Так у Вас Database.EnsureCreatd() закомментирован
0
Фрилансер
 Аватар для FateOri
761 / 458 / 146
Регистрация: 06.01.2017
Сообщений: 4,856
28.09.2021, 12:03
Элд Хасп, если с БД особо дела не имели то в EF лучше сразу не лезьте))
там легко можно голову сломать прежде чем получить требуемое

я для учебных / студенческих работ EF использую а для рабочих стараюсь обходится без него)

посмотрите лучше на SQLite-net

https://github.com/praeclarum/sqlite-net

для тривиальных проектов этого обычно достаточно

а для тех что посложнее есть LINQ to DB

https://github.com/linq2db/linq2db
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
28.09.2021, 13:25  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
Так у Вас Database.EnsureCreatd() закомментирован
Я знаю.
И посмотрите пост выше.
База создаётся и в ней можно сохранять данные.
Даже если запустить несколько экземпляров приложения, данные нормально через БД передаются.


Цитата Сообщение от FateOri Посмотреть сообщение
если с БД особо дела не имели то в EF лучше сразу не лезьте
Мне напротив надо как можно более инкапсулировать все БД инструменты.
И EF лучше всего подходит для этого.
0
HF
 Аватар для HF
1337 / 921 / 202
Регистрация: 09.09.2011
Сообщений: 2,742
Записей в блоге: 2
28.09.2021, 13:35
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Насколько я понимаю, это должен делать EF.
Я хз. Но в вашем проекте EF же даже не было. Всё закомменчено и пакетов нет.
В свою очередь, я запустил, убедился что не сохраняет, проверил известные пути, проверил свойство базы данных в отладке. Всё показало что данные находятся в альтернативном измерении. Добавил, работает, отчитался на форуме.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Как видите данные между сеансами сохраняются.
При первом тесте не работало. Файлов не создавалось, состояние не сохранялось. А вот при создании файла и старые данные появились и дубли-инсерты.

Добавлено через 3 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
База создаётся и в ней можно сохранять данные.
Где? Вы ж говорили что не создаётся. Когда она начала создаваться? Я видимо потерял нить событий. В гите тоже ничего не изменилось в эту сторону.

Добавлено через 59 секунд

Не по теме:

Цитата Сообщение от Элд Хасп Посмотреть сообщение
На Гите зафиксировал.
goto!! фанат goto детектед! :D



Добавлено через 1 минуту
Цитата Сообщение от FateOri Посмотреть сообщение
посмотрите лучше на SQLite-net
Я уже рассказывал про этот вариант. Причём это как раз средний вариант - и не "ручное" писательство и не гиганский орм и linq есть и типизация. Но он ещё разбирается и ищет свой путь.
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
28.09.2021, 14:03  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Я хз. Но в вашем проекте EF же даже не было. Всё закомменчено и пакетов нет.
System.Data.SQLite их подтягивает.

Почему-то в Core не отображаются подтянутые пакеты.
А на Framework их видно.

Добавлено через 1 минуту
Цитата Сообщение от HF Посмотреть сообщение
В свою очередь, я запустил, убедился что не сохраняет
То есть вы ввели данные. Закрыли сеанс.
Запустили приложение заново и данных из предыдущего сеанса нет?

Я тогда воще в шоке!
А у меня почему они сохраняются?!

Добавлено через 2 минуты
Цитата Сообщение от HF Посмотреть сообщение
Где? Вы ж говорили что не создаётся.
Она у меня создаётся, но неизвестно где.
По крайней мере я так думаю.
Иначе я не могу объяснить почему у меня данные между сеансами сохраняются.
Сохраняются даже если скопировать сборку на другой (пустой) диск.

Добавлено через 1 минуту
Цитата Сообщение от HF Посмотреть сообщение
Но он ещё разбирается и ищет свой путь.
Угу.
Так и есть.
Хочется именно разобраться.
Особенно в такой начальной элементарщине вроде.

Добавлено через 45 секунд
Цитата Сообщение от HF Посмотреть сообщение
goto!! фанат goto детектед!
Здесь для теста пойдёт.
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
28.09.2021, 14:18
Я ее нашел
Миниатюры
Code First - выбор: Microsoft.EntityFrameworkCore.Sqlite, Microsoft.Data.Sqlite, System.Data.SQLite и др.  
1
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
28.09.2021, 14:21
И Вы не EF используете
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
28.09.2021, 14:26  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Я хз. Но в вашем проекте EF же даже не было. Всё закомменчено и пакетов нет.
Добавил проект "Консоль для FW" - в нём все пакеты явно видны.
Работает у меня так же как и на Core: данные между сеансами сохраняются, обе сборки работаю с одной БД и можно сеансы запускать одновременно.
Но самой БД нигде найти не могу.
Просто фантастика какая-то!



Добавлено через 38 секунд
Цитата Сообщение от ipsorokin Посмотреть сообщение
И Вы не EF используете
А что?

Добавлено через 57 секунд
DBcontext - это разве не из EF?

Добавлено через 2 минуты
Цитата Сообщение от ipsorokin Посмотреть сообщение
Я ее нашел
Всё хорошо - но у меня сервер даже не установлен....
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
28.09.2021, 14:27
Этот DbContext из System.Data.Entity. А в EFCore другой)))
0
HF
 Аватар для HF
1337 / 921 / 202
Регистрация: 09.09.2011
Сообщений: 2,742
Записей в блоге: 2
28.09.2021, 14:30
Цитата Сообщение от ipsorokin Посмотреть сообщение
Я ее нашел
Круто. Реально там лежит. А файлы просто в корне профиля валяются.
Причём самое интересное что localDB был отстановлен. Значит она или сама умеет писать без сервиса, а регистрирует в его общем хранилище. Или же запускает localDB и потом останавливает. Никогда о таком не слышал. Видимо это из-за того что это не чистый Interop и у него какая-то абстракция EF есть. Он не может без БД жить.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
28.09.2021, 14:30  [ТС]
ipsorokin, да у меня тоже она в "Обозревателе объектов SQL Server" нашлась.
И как это понять?
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
28.09.2021, 14:32
Цитата Сообщение от HF Посмотреть сообщение
localDB
Он, вроде как запускается вместе с приложением, которое его использует, и работает пока приложение не закроют. Собственно это его фишка.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2021, 14:32

Не удалось найти запрошенного поставщика данных (System.Data.SQLite)
Добавил в код System.Data.SQLite.dll, подключил в начале кода, вместе с Common. Код простой, банально на создание базы данных. Но при...

Установка System.Data.SQLite для Visual Studio 2015
Пытаюсь разобраться, как подключить SQLite к EF. Но первая же проблема - не могу скачать файл...

Не могу подключиться к SQLlite (Could not load file or assembly 'System.Data.SQLite)
Хочу приконнектиться к базе на sqllite, скачал библиотеку нужную для sqllite отсюда:...

Не работает проверка существования таблицы через метод ExecuteNonQuery() из System.Data.SQLite.dll
Использую приведенный ниже метод для определения существования таблицы в БД public int iExecuteNonQuery(string FileData, string sSql) ...

программа подключается к базе (Firebird, SQLite) только на компе с Microsoft Visual C#
Подскажите, пожалуйста, как разобраться. Программа подключается к базе (Firebird, SQLite) только на компе с Microsoft Visual C#, на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru