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

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

22.09.2021, 19:48. Показов 13233. Ответов 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 2
27.09.2021, 23:52  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Usaga Посмотреть сообщение
Можете воспользоваться утилитой procmon.exe чтобы увидеть какие файлы открывает ваш процесс.
Первое впечатление, что никакой файл не открывает.....
Сейчас делаю полный сейф лога и по нему попробую текстом поискать.

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

Завтра на свежую голову, ещё покопаюсь, но пока даже проблеска мысли нет куда копать надо.
0
Эксперт .NET
 Аватар для Usaga
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
27.09.2021, 23:57
Элд Хасп, да просто сюда архив с проектов выложите)
1
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
28.09.2021, 00:58
Элд Хасп, Вы не ищете легких путей, только "мощь" EF, только хардкор.
Ну что же, ждите "много открытий чудных.."
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 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
14724 / 9493 / 1362
Регистрация: 21.01.2016
Сообщений: 35,790
28.09.2021, 09:24
Цитата Сообщение от HF Посмотреть сообщение
Видимо без файла - он работает в режиме InMemory.
Я тоже о таком раскладе подумал.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 2
28.09.2021, 10:58  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
И ещё, удалять каталог - это вообще мне кажется какая-то жесть.
Это для тестирования, чтобы проверить как создаётся не только база, но и весь путь.
Но эта часть сейчас всё равно не работает.
Код не выполняется независимо от выбора варианта, так как не существует искомого пути.


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

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


Цитата Сообщение от HF Посмотреть сообщение
SQLiteConnection.CreateFile(dbName);
Насколько я понимаю, это должен делать EF.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru