Модератор
![]() ![]() |
|||||||||||
SQLite Code First - выбор: Microsoft.EntityFrameworkCore.Sqlite, Microsoft.Data.Sqlite, System.Data.SQLite и др.22.09.2021, 19:48. Показов 11542. Ответов 96
Метки нет Все метки)
(
Работаю с БД очень редко.
Поэтому опыт маленький и знания обрывочные. Стоит задача в Решении Framework 4.8 создать репозиторий на SQLite для такого контекста (пример):
Хотелка: реализация Code-First, то есть после запуска приложения в новом расположении без БД, что бы автоматически она была создана. Доп. хотелки: 1) Запись в новую базу каких-то начальных данных (для образца); 2) Сделать независимые контексты для каждой сущности. То есть они могут быть в разных БД или в одной, но в разных таблицах. Это определяется уже при использовании репозитория передачей разных (каких?) параметров в конструктор. Не знаю: 1) Для SQLite есть несколько разных основных пакетов, а к ним ещё и дополнительные. Какие лучше использовать? 2) Что ещё нужно добавить в конструктор и переопределяемые методы для реализации этой задачи? И насколько я понимаю, в зависимости от используемого комплекта пакетов, код реализации контекста может быть разный? 3) Атрибута [Index] для SQLite я не нашёл. Я его не там искал или его у SQLite DBContext нет? Если нет то как решить проблему быстроного поиска по нужному значению?
0
|
22.09.2021, 19:48 | |
Ответы с готовыми решениями:
96
System.data.sqlite не существует! Почему нет SQLite в разделе System.DATA Как включить поддержку ICU в System.Data.SQLite ? |
![]() |
|
22.09.2021, 23:40 | |
Если DbContext нужен - то разумеется только EF.
Если нужен лёгкий сервис без извращений - оригинальный System.Data.SQLite. Будет только 1 либа (+1 в нагрузку). Microsoft.Data.Sqlite - это середнячок от микрософта, но он по сути - аналог оригинальной. Соответственно - нужен контекст и всякие навороты с миграциями - только EF. Если готовы репозиторий и "миграции" сами создать - оригинал. Я использую чистый. "Репозиторий" сделал сам, или можно использовать SQLite.Net пакет, он чуть больше умеет. Создание таблиц и миграции тоже сам написал в реализации - набор файлов скриптов и автовыполнение их при необходимости. Удобно - эти же файлы можно руками запускать.
1
|
Модератор
![]() ![]() |
||
23.09.2021, 00:23 [ТС] | ||
HF, спасибо.
Мне нужно с наименьшими рука-движениями. Как уже писал - БД знаю плохо. И как-то пока не возникло необходимости в изучении. Поэтому, оптимально нужно что-то задать (код) в контексте и забыть об этом. Дальше чтобы использовать как просто последовательности сущностей. System.Data.SQLite подтягивается System.Data.SqlClient.EF6 и контекст EF тоже можно использовать.Но вот Code First (насколько разобрался) в нём нет. Нужно ещё какой-то дополнительный пакет ставить. Добавлено через 7 минут HF, да, и забыл написать в вопросе (сейчас дополнил) о проблеме (для меня) атрибута [Index] для SQLite.
0
|
![]() ![]() 13481 / 9013 / 1326
Регистрация: 21.01.2016
Сообщений: 33,824
|
||||||
23.09.2021, 00:53 | ||||||
EnsureCreated() . EF 6 так НЕ умеет.Насчёт создания базы, если её нет. Вам для этого EF вообще не обязателен. Вы можете: а) Или файл пустой базы (включая начальные данные) тащить с приложением. Когда надо создать базу, то просто сей файл копируете куда надо. б) Создать эту базу руками и оставить её в проекте (но не в дистрибутиве конечного приложения). Потом просто экспортировать из неё SQL-скрипт (дамп) создания базы и наполнения данными. Этот скрипт всегда можно выполнить для создания новой базы. Я бы выбирал из этих двух вариантов, а не налегал бы на возможности миграции EF'а.
1
|
Модератор
![]() ![]() |
|||||||||||||||
23.09.2021, 10:06 [ТС] | |||||||||||||||
Сам тоже потом читал. В том числе: Шаблон репозитория. Модель работает с отдельными узлами агрегации (?) Contacts и Phones. По сути не важно какое в каждом из них используется хранилище. И я задумался над тем можно ли их сделать полностью независимыми, в отдельных сборках. В модель будут передаваться только экземпляры Contacts и Phones. А как там они уже внутри реализованы для модели не важно. Так же не должно быть важно для Contacts как реализован Phones и наоборот. Каждый из них получает в параметрах БД с которой будет работать (или локальный xml-файл в других реализациях) и этого должно быть достаточно. Но тогда контекст у них должен быть у каждого свой:
Если БД уже создана с общей архитектурой, то проблем, насколько понимаю, быть не должно. А вот, что будет если БД нет и её должен создать Code First? Первым был вызван ContactsDB - он создаст БД со своей таблицей. Потом будет вызван PhonesDB. БД уже есть, но в ней нет нужной таблицы. Code First добавит нужную таблицу или будет какая-то ошибка? Ху из ху? Но с System.Data ещё и проблема с подтягиванием зависимостей. Мы тоже один раз с вами уже этим занимались. При установке System.Data в сборке репозитория и потом использовании его в в основном проекте Решения, в него подтягивается System.Data, но не подтягиваются какие-то зависимые пакеты. И приходится в основной проекте тоже явно устанавливать полностью Nuget System.Data. У меня все задачи учебные. Какие-то для самообучения, какие-то для обучения кого-то. Поэтому задача изучить как сделать вот таким-то образом, чтобы потом можно было осознано выбирать как лучше. В данном случае Решение не моё. В нем реализована работа с БД через конекторы, адаптеры, SQL команды и тд. Репозиторий даже не выделен в отдельный проект. Вот мне стало интересно изучить как это можно сделать по феншую и с минимальным ручным кодированием. Добавлено через 18 минут Сразу вопрос об атрибуте [Indeх] - его нет ни в одном пакете Nuget (из указанных в названии темы).Как быть с ним?
0
|
Модератор
![]() ![]() |
|||||||
23.09.2021, 10:46 [ТС] | |||||||
0
|
![]() |
|
23.09.2021, 11:02 | |
Что-то вы капец наворочали. И то и другое и третье. Вы можете озвучить ваше приоритетное желание и проблему которая мешает этой реализации? Потому что не понятно как ответить. У вас на каждый абзац можно дать разный ответ, так как подходы будут разные.
Ещё раз повторюсь - если вы используете EF, то всё. Пользуйтесь тем что он предоставляет и всё что с этим связано. Есть пакеты миграций баз. Само оно не работает как надо. Всё равно все, в итоге, пишут надстройку. Мы, с Usaga, вам посоветовали - пишите свой мигратор. По структуре это: 1) набор скриптов, начиная от создания таблиц, и далее как обычно добавления, обновления структур и данных. 2) метод в коде который будет запускать сервис который будет создавать файл (или считывать существующий) и накатывать нужные обновления. Это простейший метод - читаем файл как текст, вызываем запрос. Про модели. Если "в нем реализована работа с БД через конекторы, адаптеры, SQL команды и тд.", то нужно представлять что именно и как там реализовано. Изначально, вы не сможете сделать универсальный репозиторий. У вас будет на каждую таблицу свой репозиторий с захардкоженными запросами на каждый метод. Если хотите сделать генерик репозиторий с LINQ запросами - SQLite.NET. Он на это "заточен". Про контекст. Исходя из реализации репозиториев будет понятно какой сложности контекст. Но раз вы сказали про разные БД, то - UoW вам в помощь. Именно так я сразу сделал свой контекст. Даже с одной БД, можно реализовать контекст сложных репозиториев, которые могут быть как генерик, так и типизированные.
0
|
![]() ![]() 13481 / 9013 / 1326
Регистрация: 21.01.2016
Сообщений: 33,824
|
||||||
23.09.2021, 14:12 | ||||||
Добавлено через 3 минуты Я не против того, что вы взяли EF для работы (конечно же это наглая ложь). Но ещё и миграции на эту штуку взвешивать... Вот это точно не учебный подход. Тем более, что у вас уже с ним проблемы начали, с поиском атрибутов для индексов). Но миграции тут мелочь, на самом деле. Вот попытка нагородить огороды в DAL с кучами контекстов специфичных для репозиториев меня реально опешила)
2
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|
23.09.2021, 16:16 | |
I. На мой непросвещенный взгляд, у EF есть только два достоинства:
1. Иллюзия "быстрой" разработки приложений для работы с СУБД (для новичков). 2. Способность при простом коде выполнять множественные изменения в БД в разных таблицах в контексте единой транзакции (реально эффективно даже для опытных разработчиков). Если второе не нужно, EF в топку ! II. Выноска всей логики работы в БД в репозиторий. Основной код приложения ничего не должен знать о том, какой сервер, где он и вообще что там делается. Работа идет с моделями, получение их и правка в БД - все в репозитории ! III. Создание БД и миграция данных. Пишется метод в репозитории CreateMyDataBase, в котором проверяется наличие БД и, если ее нет, то она создается и в нее записывается единственная хранимка (см. далее) из текстового файла в установочном пакете. Пишется метод в репозитории CreateMyDataBaseInstance, в котором проверяется наличие данных в БД, включая метаданные о таблицах и прочие. Если таблиц нет, то запускается вышеупомянутая хранимка. Предусмотреть опцию пересоздания БД даже если есть таблицы. Хранимка уничтожает таблицы, если они есть, создает их по новой, после чего заполняет отладочными данными либо выполняет заливку их из сторонних источников, например из другой (других) БД либо из csv, положенных в установочный пакет.
1
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|
23.09.2021, 18:49 | |
Usaga, За простоту и "читабельность" алгоритмики нужно платить ресурсами и производительностью.
А за производительность и экономию ресурсов платить сложным громоздким кодом. Искусство программирования заключается в нахождении оптимального компромисса ![]()
0
|
Модератор
![]() ![]() |
||
24.09.2021, 11:32 [ТС] | ||
Usaga, MsGuns, ipsorokin, HF, всем спасибо!
Извиняюсь за: Попробую привести его немного в порядок и потом более конкретизирую свои вопросы.
0
|
Модератор
![]() ![]() |
||||||||||||
24.09.2021, 12:37 [ТС] | ||||||||||||
Сейчас сделано на Microsoft.EntityFrameworkCore.Sqlite 3.1.19 вот так (пример):
Но возник он из реальной (не моей) задачи. Так же вроде решили всё же перейти с FW на Core. После перехода на Core, потестирую в нём и посмотрю какие вопросы смогу решить сам, а какие нет и конкретизирую их здесь. У меня "душа" лежит за Sysytem.Data.SQLite. Но у него проблемы с вытягиванием зависимостей репозитория в основной проект Решения. Мы с вами уже разбирались с этим. И самым простым решением оказалось двойная установка этого пакета в проекте Репозитория и в Основном Проекте. Возможно после перехода на Core он станет нормально тянуть зависимости и тогда вопрос выбора пакетов отпадёт.
0
|
![]() ![]() 13481 / 9013 / 1326
Регистрация: 21.01.2016
Сообщений: 33,824
|
|||||||||||||
24.09.2021, 13:05 | |||||||||||||
Элд Хасп, не надо так:
Database.EnsureCreated() должно быть достаточно. Вроде бы EF Core уже сам умеет базу создавать. Проверьте. Если нет, то вынисите эту байду в статический конструктор, чтобы один раз отрабатывало, при запуске приложения, а не при каждом создании контекста.
0
|
Модератор
![]() ![]() |
||||
24.09.2021, 14:25 [ТС] | ||||
Поэтому папку я создаю дискретным кодом. А БД в ней создаёт уже Database.EnsureCreated() .Добавлено через 5 минут
0
|
24.09.2021, 14:25 | |
Помогаю со студенческими работами здесь
20
Не удалось найти запрошенного поставщика данных (System.Data.SQLite) Установка System.Data.SQLite для Visual Studio 2015 Не могу подключиться к SQLlite (Could not load file or assembly 'System.Data.SQLite) Не работает проверка существования таблицы через метод ExecuteNonQuery() из System.Data.SQLite.dll
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
![]() |
||||
Создаем RESTful API на Golang с Fiber
golander 04.06.2025
Я перепробовал десятки фреймворков для создания RESTful API за последние годы, и когда впервые столкнулся с Fiber, понял, что это совсем другой уровень. Нет, я не собираюсь рассказывать сказки о. . .
|
Как работать с куки в ASP.NET Core
UnmanagedCoder 04.06.2025
Когда я впервые начал работать с куки в ASP. NET Core, меня поразило, насколько отличается работа с ними от классического ASP. NET. В Core все стало более декомпозированным - больше нет удобного. . .
|
Рисование коллайдеров физического движка Box2D-WASM v3 на Three.js
8Observer8 04.06.2025
Erin Catto (автор Box2D) переписал с нуля Box2D v2 с С++ на Си и появилась версия Box2D v3. Birch-san собрал Box2D v3 в WebAssembly (WASM), чтобы можно было использовать Box2D v3 на JavaScript.
В. . .
|
Worker Threads и многопоточность в Node.js
Reangularity 03.06.2025
Если вы когда-нибудь посещали собеседования на позицию Node. js разработчика, почти наверняка слышали заезженную фразу: "Node. js - однопоточная платформа". Звучит как неоспоримый факт, который. . .
|
Event-Driven CQRS на C# с паттерном Outbox
stackOverflow 03.06.2025
В традиционной модели происходит примерно следующее: вы получаете команду, обрабатываете ее, сохраняете результат в базу данных и затем пытаетесь опубликовать событие в брокер сообщений. Но что если. . .
|
OwenLogic: перенос сетевых переменных в панель Weintek (EasyBuilder Pro)
ФедосеевПавел 03.06.2025
ВВЕДЕНИЕ
ПЕРЕД ЭКСПЕРИМЕНТАМИ - СОЗДАЙТЕ РЕЗЕРВНЫЕ КОПИИ ПРОЕКТОВ
На момент написания статьи (02 июня 2025 г. ) самыми актуальными версиями ПО являются:
OwenLogic v. 2. 10. 366
EasyBuilder Pro. . .
|
Dev-c++5.11 Покорение вершины
russiannick 02.06.2025
С утра преследовала одна мысль - вот бы выучить С++. Сказано-сделано. Окончив смену, скачал в интернете бестселлер Дэвиса Dev-C++ для чайников. Книга оказалась интересной и я скачал среду, на примере. . .
|
Тестирование Pull Request в Kubernetes с GitHub Actions и GKE
Mr. Docker 02.06.2025
Мы все знаем, что тестирование на локальной машине или в изолированном CI-окружении — это не совсем то же самое, что тестирование в реальном кластере Kubernetes. Контекстно-зависимые ошибки, проблемы. . .
|
Оптимизация CMake для ускорения сборки
bytestream 02.06.2025
Вы когда-нибудь ловили себя на мысле, что пока ваш проект компилируется, можно успеть сварить кофе, прочитать главу книги или даже сбегать в соседний офис? Если да, то добро пожаловать в клуб. . .
|
JS String.prototype.localeCompare()
mr_dramm 02.06.2025
скопировано из этой темы чтобы не потерялось.
localeCompare без указания локали для сравнения строк под капотом использует Intl. Collator , который работает согласно Unicode Collation Algorithm. . .
|