Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
SQLite

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

22.09.2021, 19:48. Показов 13248. Ответов 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
24.09.2021, 14:55  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
Я имел ввиду, что создает базу в конкретном месте, а не целиком путь.
Вы же сказали, что создаете специально под базу директорию))
Прошу прощения за неясные разъяснения.
БД и Папка не являются частью сборки.
Поэтому при переносе сборки их не будет.
Кроме того, возможно, для каждого пользователя на компе будет отрываться своя папка где-то в расположении Application.LocalUserAppDataPath.

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

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

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

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

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

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

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

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

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

Ну и да, осталось инициализировать эти контексты, читая из конфигов настройки пути до файлов.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
1340 / 924 / 202
Регистрация: 09.09.2011
Сообщений: 2,743
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
24.09.2021, 19:54  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
Наверное, имелось ввиду что-то типо этого
Очень похоже на то, чего хотелось добиться.
Но пока нет полного осмысления.
Буду вникать.
0
Эксперт .NET
 Аватар для Usaga
14729 / 9505 / 1362
Регистрация: 21.01.2016
Сообщений: 35,848
27.09.2021, 07:57
Цитата Сообщение от ipsorokin Посмотреть сообщение
Lazy loading
А-ся-ся такое советовать)
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
14729 / 9505 / 1362
Регистрация: 21.01.2016
Сообщений: 35,848
27.09.2021, 22:20
Цитата Сообщение от Элд Хасп Посмотреть сообщение
для консольного проекта пока работает.
А тип проекта тут ни на что не влияет.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но по указанному пути её нет!
Ну прямо чудеса) Если путь абсолютный, то файл будет именно там)
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
27.09.2021, 22:20
А в AppData не попадает?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
27.09.2021, 22:49  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
AppData
ipsorokin, поиск минут десять длился.
Там тоже нет БД.

Добавлено через 1 минуту
Цитата Сообщение от ipsorokin Посмотреть сообщение
AppData\Local\VirtualStore
Эта папка пустая.
0
Эксперт .NET
 Аватар для Usaga
14729 / 9505 / 1362
Регистрация: 21.01.2016
Сообщений: 35,848
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Жара жесть.
kumehtar 18.08.2026
Пролетают летом дни Тридцать пять жары в тени. Каждый август год от года Дарит жаркую погоду.
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru