Форум программистов, компьютерный форум, киберфорум
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. Показов 13186. Ответов 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
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
24.09.2021, 14:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если закомментировать код создания папки, то вот такое исключение:
Я имел ввиду, что создает базу в конкретном месте, а не целиком путь.
Вы же сказали, что создаете специально под базу директорию)) А раз подключение идет через конкретный фал по конкретному пути, а не к серверу, то путь должен существовать.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
24.09.2021, 14:40  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Цитата Сообщение от Элд Хасп Посмотреть сообщение
public string PathAndNameDB { get; }
Тоже лишнее.
Это копи-паста. Не знал как сделать по иному.

А как передать путь и имя базы?

Насколько понял он нужен в:
C#
22
23
24
25
        protected override void OnConfiguring(DbContextOptionsBuilder options)
        {
            options.UseSqlite($"Data Source={PathAndNameDB}");
        }
Добавлено через 3 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
Зачем стопятьсот раз контекст в рамках одного метода создавать?))) Можно и один раз)
Это же просто тест, для проверки как создаётся база.
Писал - "как в голову взбредёт" и так чтобы понятно было.
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
24.09.2021, 14:40
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А как передать путь и имя базы?
app.config?

Ну и если решили делать через EF, посмотрите сразу навигационные свойства и Lazy loading.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
24.09.2021, 14:55  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
Я имел ввиду, что создает базу в конкретном месте, а не целиком путь.
Вы же сказали, что создаете специально под базу директорию))
Прошу прощения за неясные разъяснения.
БД и Папка не являются частью сборки.
Поэтому при переносе сборки их не будет.
Кроме того, возможно, для каждого пользователя на компе будет отрываться своя папка где-то в расположении Application.LocalUserAppDataPath.

Добавлено через 9 минут
Цитата Сообщение от ipsorokin Посмотреть сообщение
app.config?
Не вариант.
В реальном приложении может быть несколько БД и надо между ними переключаться.
Имя БД должно передаваться.
Или как-то динамически можно менять строку подключения в congig?
Да, так же (как учебный вариант) возможно и одновременное использование разных БД.

Цитата Сообщение от ipsorokin Посмотреть сообщение
если решили делать через EF, посмотрите сразу навигационные свойства и Lazy loading.
Это я знаю и использовал в другом проекте Пример создания приложения "Работа с комнатами в студенческих общежитиях".
Но здесь как бы оно не надо.
Собираться все сущности будут в линейные коллекции, а иерархия будет строиться с помощью CollectionView.
0
HF
 Аватар для HF
1337 / 921 / 202
Регистрация: 09.09.2011
Сообщений: 2,742
Записей в блоге: 2
24.09.2021, 16:15
А почему не вариант хранить строки в app.config? Они не могут называться по разному? ContactsDbConnectionString, BooksDbConnectionString и т.п. ?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не вариант.
В реальном приложении может быть несколько БД и надо между ними переключаться.
Имя БД должно передаваться.
Или как-то динамически можно менять строку подключения в congig?
Да, так же (как учебный вариант) возможно и одновременное использование разных БД.
У меня ощущение что вы проигнорировали мой предложенный вариант. UoW. Каждый контекст имеет свою инициализацию. Соответственно и параметры там свои могут быть. А эти строки вы всё равно будете получать откуда то.

Насчёт "переключаться". Вы же не менять строки коннекции будете, а переключаться между уже настроенными контекстами, репозиториями.

Строку в конфиге динамически менять? для чего? чтобы потом оттуда её прочитать?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
24.09.2021, 18:25  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
У меня ощущение что вы проигнорировали мой предложенный вариант.
Я не проигнорировал, а "перевариваю" всё сказанное.

Цитата Сообщение от HF Посмотреть сообщение
Каждый контекст имеет свою инициализацию. Соответственно и параметры там свои могут быть.
Вот это не понял.
Разве я не так и сделал?

Строки будут храниться где-то в расположении Application.LocalUserAppDataPath.
Там будет какой-то файл настроек отдельный для каждого пользователя.
Каким образом они получаются оттуда в контексте этой темы не важно.

Вот получил я строки "DataBases/contacs1.db" и "DataBases/contacs2.db".
И как мне теперь работать с этими двумя БД?
Я предполагал, что их надо передавать в конструктор ContactBD.
0
HF
 Аватар для HF
1337 / 921 / 202
Регистрация: 09.09.2011
Сообщений: 2,742
Записей в блоге: 2
24.09.2021, 18:36
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Разве я не так и сделал?
Я не видел.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вот получил я строки "DataBases/contacs1.db" и "DataBases/contacs2.db".
И как мне теперь работать с этими двумя БД?
Вы в курсе как выглядит UoW реализация?
В кратце - контекст один. Внутри приватно созданы контексты других БД. Наружу торчат репозитории, которые для нас - единый контекст, но ссылаются они на свои БД, которые в свою очередь, со своим контекстом.

Ну и да, осталось инициализировать эти контексты, читая из конфигов настройки пути до файлов.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
24.09.2021, 19:03  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Вы в курсе как выглядит UoW реализация?
Нет.
Почитаю.
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
24.09.2021, 19:23
Наверное, имелось ввиду что-то типо этого
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    class MainContextContact : DbContext
    {
        public DbSet<Contact> Contacts { get; set; }
 
        protected override void OnConfiguring(DbContextOptionsBuilder options)
        {
            options.UseSqlite($"Data Source=contacts.db");
        }
    }
 
    class MainContextPhone : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder options)
        {
            options.UseSqlite($"Data Source=phones.db");
        }
        public DbSet<Phone> Phones { get; set; }
    }
 
    class ContactRepository
    {
        private MainContextContact context;
 
        public ContactRepository(MainContextContact context)
        {
            this.context = context;
        }
        public void Add(object o)
        {
            context.Contacts.Add(o);
        }
        /* и т.д. */
    }
 
    class PhoneRepository
    {
        private MainContextPhone context;
 
        public PhoneRepository(MainContextPhone context)
        {
            this.context = context;
        }
        public void Add(object o)
        {
            context.Phones.Add(o);
        }
        /* и т.д. */
    }
 
    // Используем через это
    class UoWCLass
    {
        public ContactRepository Contact;
        public PhoneRepository Phones;
    }
3
HF
 Аватар для HF
1337 / 921 / 202
Регистрация: 09.09.2011
Сообщений: 2,742
Записей в блоге: 2
24.09.2021, 19:45
Цитата Сообщение от ipsorokin Посмотреть сообщение
Наверное, имелось ввиду что-то типо этого
Да, именно. Там уже личные вариации по композиции, но суть такая.

Цитата Сообщение от ipsorokin Посмотреть сообщение
UoWCLass
Обычно называют лаконично - UoW

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Почитаю.
И потом уже используем, даже не задумываясь где на самом деле хранятся эти сущности.

C#
1
2
uow.Contacts.Add(item);
var s = uow.Phones.Where(a => a == item.Phone);
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
24.09.2021, 19:54  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
Наверное, имелось ввиду что-то типо этого
Очень похоже на то, чего хотелось добиться.
Но пока нет полного осмысления.
Буду вникать.
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
27.09.2021, 07:57
Цитата Сообщение от ipsorokin Посмотреть сообщение
Lazy loading
А-ся-ся такое советовать)
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
27.09.2021, 22:14  [ТС]
Usaga, MsGuns, ipsorokin, HF, перешёл на Core.
В отношении System.Data.SQLite - проблемы с неподтягиванием зависимостей в основной проект не возникло.
По крайней мере для консольного проекта пока работает.

Если и дальше проблем не будет, то вы бор однозначно будет в его пользу.

Но возникла неожиданная проблема.
"Тихо шифером шурша, крыша едет не спеша" - не могу найти где создаётся БД!
Она создаётся, в неё записываются элементы в тестовом коде.
Но по указанному пути её нет!
Получаю для проверки db.Database.Connection.Database - там вся правильно, путь и имя которые и указывал.
Путь и имя передаю явно в конструктор string dbName = @"C:\SQLite\contacs.db"; ... var db = new ContactsDB(dbName).

Ссылка на Git: https://github.com/EldHasp/SQLiteExamle
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
27.09.2021, 22:20
Цитата Сообщение от Элд Хасп Посмотреть сообщение
для консольного проекта пока работает.
А тип проекта тут ни на что не влияет.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но по указанному пути её нет!
Ну прямо чудеса) Если путь абсолютный, то файл будет именно там)
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
27.09.2021, 22:20
А в AppData не попадает?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
27.09.2021, 22:29  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
А в AppData не попадает?
Сейчас проверю...

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
А тип проекта тут ни на что не влияет.
Очень на это надеюсь.

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Если путь абсолютный, то файл будет именно там)
Ну так нет его там!
А даже специально виртуальный пустой диск создал перенёс сборку туда и там запускаю.
Ничего не добавляется - базы нет!
Вернее она есть, но неизвестно где!

Добавлено через 3 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
путь абсолютный
Сначала задал относительный - ничего понять не могу!
Решил для упрощения задать абсолютный - тут-то он никуда не денется!
Ну, да.... не денется.
До сих пор репу чещу...

Добавлено через 2 минуты
Я ещё обрадовался, что весь путь автоматически создаётся.
Из переопределения контекста всё убрал кроме DBSet.
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
27.09.2021, 22:46
Если вкратце, то я имел ввиду виртуализацию. Там бывает пишет в другую папку ...AppData\Local\VirtualStore
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
27.09.2021, 22:49  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
AppData
ipsorokin, поиск минут десять длился.
Там тоже нет БД.

Добавлено через 1 минуту
Цитата Сообщение от ipsorokin Посмотреть сообщение
AppData\Local\VirtualStore
Эта папка пустая.
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,749
27.09.2021, 22:50
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ничего не добавляется - базы нет!
Вернее она есть, но неизвестно где!
Можете воспользоваться утилитой procmon.exe чтобы увидеть какие файлы открывает ваш процесс. Тут не надо гадать, всё можно замерить и посмотреть.
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
27.09.2021, 22:52
Цитата Сообщение от Usaga Посмотреть сообщение
Тут не надо гадать, всё можно замерить и посмотреть.
Легкие пути для слабаков
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.09.2021, 22:52

Не удалось найти запрошенного поставщика данных (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#, на...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
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