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

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

22.09.2021, 19:48. Показов 13239. Ответов 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
28.09.2021, 21:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
System.Data.Entity
Это все равно не Core. Хотя говорили, что перешли.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Завтра буду разбираться как явно надо задавать провайдеров.
Цитата Сообщение от HF Посмотреть сообщение
Начальная ошибка и недоразумение было в том что pathAndNameDB использовался как имя базы данных. Когда его передают в base то он используется для поиска в строках подключения.
А нормальная строка коннекции должна быть другой и к этому всё равно придёте.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я могу написать пока только о практических результатах моего "научного тыка".
Вы на это уже ответили как раз "тыком". Про конфиги по ссылке выше написано. "Вот так тогда работала, а сейчас вот так не работает" - этим подтвердили.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,172
Записей в блоге: 2
28.09.2021, 22:26  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
"Вот так тогда работала, а сейчас вот так не работает" - этим подтвердили.
Да.
Теперь хочу разобраться, как не из конфига задавать.
Чтобы было (у меня) полное понимание этого момента.
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
29.09.2021, 00:36
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Завтра буду разбираться как явно надо задавать провайдеров.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public class EFConfiguration : DbConfiguration
    {
        public EFConfiguration()
        {
            SetProviderFactory("System.Data.SQLite", System.Data.SQLite.SQLiteFactory.Instance);
            SetProviderFactory("System.Data.SQLite.EF6", System.Data.SQLite.EF6.SQLiteProviderFactory.Instance);
            SetProviderServices("System.Data.SQLite", (System.Data.Entity.Core.Common.DbProviderServices)System.Data.SQLite.EF6.SQLiteProviderFactory.Instance.GetService(typeof(System.Data.Entity.Core.Common.DbProviderServices)));
        }
    }
 
    [DbConfigurationType(typeof(EFConfiguration))]
    public class SQLiteDbContext : System.Data.Entity.DbContext
    {
        public SQLiteDbContext(string path) : base(new SQLiteConnection(){ConnectionString = new SQLiteConnectionStringBuilder() { DataSource = path }.ConnectionString}, true)
        {
            Database.CreateIfNotExists();
        }
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }
C#
1
2
3
4
5
6
7
8
9
    public class EF
    {
        public SQLiteDbContext Context;
 
        public EF()
        {
            Context = new SQLiteDbContext(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "test.db"));
        }
    }
Добавлено через 55 минут
Лишнее можно убрать. Таблицы не создаются.
Entity Framework 6 с SQLite 3 Code First - не будет создавать таблицы
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,172
Записей в блоге: 2
30.09.2021, 17:39  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
Лишнее можно убрать. Таблицы не создаются.
Я добавил пакет SQLite.CodeFirst.
БД создаёт включая весь путь.
Добавил ещё заполнение начальными данными.
Возможно несколько коряво:
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
56
57
58
59
60
61
62
63
64
65
66
using SQLite.CodeFirst;
using System.Data.Entity;
using System.Data.SQLite;
 
namespace SystemDataModel
{
 
    public class EFConfiguration : DbConfiguration
    {
        public EFConfiguration()
        {
            SetProviderFactory("System.Data.SQLite", System.Data.SQLite.SQLiteFactory.Instance);
            SetProviderFactory("System.Data.SQLite.EF6", System.Data.SQLite.EF6.SQLiteProviderFactory.Instance);
            SetProviderServices("System.Data.SQLite", (System.Data.Entity.Core.Common.DbProviderServices)System.Data.SQLite.EF6.SQLiteProviderFactory.Instance.GetService(typeof(System.Data.Entity.Core.Common.DbProviderServices)));
        }
    }
 
    [DbConfigurationType(typeof(EFConfiguration))]
    public class ContactsDB : DbContext
    {
        private static readonly object locker = new object();
        public ContactsDB(string pathAndNameDB)
            : base(
                  new SQLiteConnection()
                  {
                      ConnectionString = new SQLiteConnectionStringBuilder()
                      {
                          DataSource = pathAndNameDB
                      }
                      .ConnectionString
                  },
                  true)
        {
            // Проверяется наличие базы.
            // Если базы нет,
            // то она автоматически создаётся и
            // заполняется данными для примера.
            lock (locker)
                if (!Database.Exists())
                {
                    Contacts.AddRange(new ContactEntity[]
                        {
                            new ContactEntity() {Id = 123, Name="Сергей (Exampl)"},
                            new ContactEntity() {Id = 567, Name="Алексей (Exampl)"}
                        });
                    Phones.AddRange(new PhoneEntity[]
                    {
                        new PhoneEntity() {Id = 9, ContactId = 123,  Title="Пожарная", Number="01"},
                        new PhoneEntity() {Id = 23, ContactId = 567,  Title="Полиция", Number="02"},
                        new PhoneEntity() {Id = 87, ContactId = 123,  Title="Скорая", Number="03"},
                        new PhoneEntity() {Id = 54, ContactId = 567,  Title="МЧС", Number="112"}
                    });
 
                    SaveChanges();
                }
        }
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<ContactsDB>(modelBuilder);
            Database.SetInitializer(sqliteConnectionInitializer);
        }
        public DbSet<ContactEntity> Contacts { get; set; }
        public DbSet<PhoneEntity> Phones { get; set; }
    }
}
DbContext инкапсулировал в Модели:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
 
namespace SystemDataModel
{
    public class Model<TIdDto, TEntity> where TIdDto : IdDto where TEntity : Entity<TIdDto, TEntity>, new()
    {
        public string Source { get; }
 
        public Model(string source)
        {
            Source = source ?? throw new ArgumentNullException(nameof(source));
            Task.Run(() => { using var db = new ContactsDB(Source); });
        }
 
        public IReadOnlyList<TIdDto> GetAll()
        {
            using var db = new ContactsDB(Source);
            return db
                .Set<TEntity>()
                .ToList()
                .Select(en => en.Create())
                .ToList()
                .AsReadOnly();
        }
        public TIdDto Get(int id)
        {
            using var db = new ContactsDB(Source);
            TEntity en = db
                .Set<TEntity>()
                .Find(id);
            if (en == null)
                return null;
            else
                return en.Create();
        }
 
        private static readonly TEntity factory = new TEntity();
        public TIdDto Add(TIdDto idDto)
        {
            TEntity en = factory.Create(idDto);
            using var db = new ContactsDB(Source);
            db
               .Set<TEntity>()
               .Add(en);
            db.SaveChanges();
 
            return en.Create();
        }
 
        public void Change(TIdDto oldDto, TIdDto newDto)
        {
            if (oldDto?.Id == null)
                throw new ArgumentNullException(nameof(oldDto), "Cтарое значение и его Id не могут быть равны null.");
 
            using var db = new ContactsDB(Source);
            var en = db
               .Set<TEntity>()
               .Find(oldDto.Id);
            if (en == null)
                throw new ArgumentException("Записи с таким Id нет.", nameof(oldDto));
            if (!en.ValuesEquals(oldDto))
                throw new ArgumentException("Запись с таким Id содержит другие данные.", nameof(oldDto));
            en.CopyFrom(newDto);
            db.SaveChanges();
        }
        public void Remove(TIdDto idDto)
        {
            if (idDto?.Id == null)
                throw new ArgumentNullException(nameof(idDto), "Значение и его Id не могут быть равны null.");
 
            using var db = new ContactsDB(Source);
            var en = db
               .Set<TEntity>()
               .Find(idDto.Id);
            if (en == null)
                throw new ArgumentException("Записи с таким Id нет.", nameof(idDto));
            if (!en.ValuesEquals(idDto))
                throw new ArgumentException("Запись с таким Id содержит другие данные.", nameof(idDto));
            db.Set<TEntity>().Remove(en);
            db.SaveChanges();
        }
 
    }
}
Тестирование:
C#
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
        static void Main(string[] args)
        {
            string dbName = @"C:\SQLite\contacs.db";
 
            Console.Write("Удалить базу и папку? (Y + Enter): ");
            if (Console.ReadLine().ToUpper() == "Y")
            {
                // Удаление  бызы и папки если они есть
                if (File.Exists(dbName))
                    File.Delete(dbName);
 
                var folder = Path.GetDirectoryName(dbName);
                if (Directory.Exists(folder))
                    Directory.Delete(folder);
            }
 
            var contactsModel = new ContactsModel(dbName);
 
            // Получение всех контактов. 
            var contacts = contactsModel.GetAll();
 
            Console.WriteLine(string.Join(Environment.NewLine, contacts.Select(c => $"{c.Id}: {c.Name}")));
 
            // Добавление одного контакта
            Console.WriteLine();
            Console.Write("Введите имя для добавляемого контакта: ");
            var contact = new ContactDto(Console.ReadLine());
            contact = contactsModel.Add(contact);
            contacts = contactsModel.GetAll();
            Console.WriteLine(string.Join(Environment.NewLine, contacts.Select(c => $"{c.Id}: {c.Name}")));
 
 
        inputId:
            // Изменение одной записи
            Console.WriteLine();
            Console.Write("Введите id изменяемого контакта (Enter - будет изменён последний): ");
            int id;
            string idStr = Console.ReadLine();
            if (string.IsNullOrWhiteSpace(idStr))
            {
                id = -1;
            }
            else if (!int.TryParse(idStr, out id))
            {
                Console.WriteLine("Это не номер.");
                goto inputId;
            }
            else
            {
                var cnt = contactsModel.Get(id);
                if (cnt == null)
                {
                    Console.WriteLine("Контакта с таким Id нет.");
                    goto inputId;
                }
                contact = cnt;
            }
 
            Console.Write("Введите имя для изменяемого контакта: ");
            contactsModel.Change(contact, new ContactDto(Console.ReadLine()));
            contacts = contactsModel.GetAll();
            Console.WriteLine(string.Join(Environment.NewLine, contacts.Select(c => $"{c.Id}: {c.Name}")));
 
            // Вывод телефонов с фильтрацией
            Console.WriteLine();
            var phonesModel = new PhonesModel(dbName);
            var phones = phonesModel.GetAll(567);
 
            Console.WriteLine("Номера контакта 567.");
            Console.WriteLine(string.Join(Environment.NewLine, phones.Select(ph => $"{ph.ContactId}-{ph.Id} {ph.Title}: {ph.Number}")));
            Console.Write("Пауза перед завершением....");
            Console.ReadLine();
 
        }
Пока, от добавления таблиц в существующую БД - отказался.
Мысль в голове витает, но нет понимания вообще о правильности реализации подобного.
Наверное, это всё же неверно.

Сделал фиксацию:
Реализовано автосоздание БД и её заполнение первичными данными. DbContext инкапсулирован в Модели.
Архив: ChoosingPackages.7z
0
HF
 Аватар для HF
1337 / 921 / 202
Регистрация: 09.09.2011
Сообщений: 2,742
Записей в блоге: 2
30.09.2021, 22:47
Цитата Сообщение от Элд Хасп Посмотреть сообщение
DbContext инкапсулировал в Модели
Это модель? Больше похоже на репозиторий с налётом извращения и трэш-кода.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Мысль в голове витает, но нет понимания вообще о правильности реализации подобного.
Наверное, это всё же неверно
Просто тоже вопрос - вы пишите что сделали. Ну сделали и сделали. Вы же свою задачу какую-то решаете. Поэтому не понятно - нужно ещё про что-то высказаться или для чего это всё?
Моё личное мнение - это какой то трэш. Простой код, прототип или набросок - он и выглядит просто и отражает цели задачи. У вас же накидано всё что я читал и видел из всех технологий. Я уже критиковал ваш WPF за излишнюю сложность, но там иногда это можно. А здесь "хеллоу ворлд с микросервисами".
И смысл стал совсем не понятен. Вроде бы вначале было "тестовый проект для изучения SqLite". Сейчас это стало монструозом каким-то. По моему мнению проект должен был быть Точно как если бы писали для EF, но слой отвечающий за DAL должен был вынесен отдельно и там реализовано ADO с чистым SQLite. Скрыли реализацию и на паблике вроде как всё обычно.
У вас же... не-до-EF.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,172
Записей в блоге: 2
30.09.2021, 23:29  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Это модель? Больше похоже на репозиторий с налётом извращения и трэш-кода.
Да. Конечно.
Это же просто тестовое приложение.
Проверял как всё работает.
Главное, что в основной проект не тянутся ни какие "хвосты" от EF и сущностей для него.

Добавлено через 8 минут
Согласен, что это не Модели, а Репозитории.
Просто начал делать с одной мыслью, а сделал по другому и уже не стал переименовывать.

Мне нужно было проверить автосоздание БД SQLite и инкапсуляцию от слоёв выше всего что касается БД.
Я до этого (год-полтора назад) пробовал (Пример создания приложения "Работа с комнатами в студенческих общежитиях" [WPF, SQLite, Элд Хасп]).
Но тогда у меня не получилось.
Почему-то в основном проекте приходилось тоже устанавливать System.Data.
Толи я тогда что-то не так делал (хотя мне помогал разубираться с этим Usaga), толи в пакет внесли какие-то изменения, но сейчас получилось.
И БД тогда я создавал "руками".

Добавлено через 15 минут
Цитата Сообщение от HF Посмотреть сообщение
Поэтому не понятно - нужно ещё про что-то высказаться или для чего это всё?
Конкретно в этом варианте решения, мне не нравится как я реализовал заполнение начальными данными.
Сделал как получилось.
В первоначальном варианте было:
C#
1
2
        modelBuilder.Entity<ContactEntity>().HasData(GetDefaultContacts());
        modelBuilder.Entity<PhoneEntity>().HasData(GetDefaultPhones());
Но для System.Data нет методов HasData.
И как их заменить по нормальному я не нашёл.


Ещё пока не разобрался как решить задачу с полем Phone.ContactId.
Надо чтобы невозможно было добавить c не существующиv Contact.Id, и чтобы нельзя было удалить Contact.Id и для которого есть Phone.ContactId.
Делать эту проверку в Модели (то есть Репозитории) наверное не верно.
Скорее всего lzk этого существуют какие-то настройки в БД.
Тоже самое, наверное, есть и для отказа изменения/удаления если запись была изменена.

Цитата Сообщение от HF Посмотреть сообщение
Вы же свою задачу какую-то решаете
В целом в рамках этой темы хочу реализовать вот такой простейший функционал на System.Data.SQLite и MS.EntityFramework.SQLite.
Посмотреть чем будут отличаться эти реализации, чтобы в дальнейшем, при необходимости, уже не задумываться какой из них использовать.
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
30.09.2021, 23:34
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Надо чтобы невозможно было добавить c не существующиv Contact.Id, и чтобы нельзя было удалить Contact.Id и для которого есть Phone.ContactId.
Делать эту проверку в Модели (то есть Репозитории) наверное не верно.
Скорее всего lzk этого существуют какие-то настройки в БД.
Этож внешние ключи и ограничения UNIQUE. По навигационным свойствам и связывают таблицы, как по ключам

Добавлено через 1 минуту
Вы сказали, что не нужны Вам навигационные)))
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
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ContactEntity>(entity =>
            {
                entity.Property(e => e.Name)
                    .IsRequired()
                    .HasMaxLength(50);
                entity.HasOne(d => d.PhoneEntity)
                    .WithOne(p => p.ContactEntity)
                    .HasForeignKey<PhoneEntity>(d => d.ContactId)
                    .OnDelete(DeleteBehavior.Cascade)
                    .HasConstraintName("FK_Contact_Phone");
            });
 
            modelBuilder.Entity<PhoneEntity>(entity =>
            {
                entity.Property(e => e.Number)
                    .IsRequired()
                    .HasMaxLength(50);
                entity.Property(e => e.Title)
                    .IsRequired()
                    .HasMaxLength(50);
            });
 
            base.OnModelCreating(modelBuilder);
        }
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,172
Записей в блоге: 2
30.09.2021, 23:35  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
Этож внешние ключи и ограничения UNIQUE. По навигационным свойствам и связывают таблицы, как по ключам
Я вроде добавил навигационные свойства, но UNIQUE - не ставил.
Буду разбираться.
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
30.09.2021, 23:36
Конкретно это
C#
1
2
3
4
5
                entity.HasOne(d => d.PhoneEntity)
                    .WithOne(p => p.ContactEntity)
                    .HasForeignKey<PhoneEntity>(d => d.ContactId)
                    .OnDelete(DeleteBehavior.Cascade)
                    .HasConstraintName("FK_Contact_Phone");
Тут связные записи должны удалиться будут (Cascade)

Добавлено через 43 секунды
Цитата Сообщение от Элд Хасп Посмотреть сообщение
UNIQUE
Это для уникальных записей. Чуть позже выложу проект, тоже натрэшкодил)))
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,172
Записей в блоге: 2
30.09.2021, 23:40  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
Вы сказали, что не нужны Вам навигационные)))
Да, они мне не нужна.
И поэтому хотел решить как без них.
А сейчас получается они будут, но я никогда не буду использовать их значения.
То есть они будут использоваться только для правильного формирования БД.
Поэтому пытаюсь почитать побольше, собрать информацию, чтобы решить как лучше сделать.

Добавлено через 2 минуты
Цитата Сообщение от ipsorokin Посмотреть сообщение
Это для уникальных записей. Чуть позже выложу проект, тоже натрэшкодил)))


Да - это тоже попробую.
И ранее вы выкладывали, что-то подобное.
Я думал "отделаться" атрибутами к классам и свойствам, но похоже так не выйдет.
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
30.09.2021, 23:42
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Я думал "отделаться" атрибутами к классам и свойствам, но похоже так не выйдет.
Fluent API более гибкий, чем атрибуты (но это не точно)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,172
Записей в блоге: 2
30.09.2021, 23:51  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
Fluent API более гибкий, чем атрибуты
Это - да.
Атрибуты - это тоже некое упрощение по обращению к Fluent API.
Но вот насколько хватает функционала этого упрощения и пытаюсь разобраться.

К тому же это ещё и чувствительно к используемому пакету.
На EF.SQLite - возможно будет несколько иначе.
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
01.10.2021, 00:20
Цитата Сообщение от ipsorokin Посмотреть сообщение
Чуть позже выложу проект, тоже натрэшкодил)))
Полный набор трэша Только там EFC
Вложения
Тип файла: zip ConsoleAppIdentity.zip (116.4 Кб, 0 просмотров)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,172
Записей в блоге: 2
02.10.2021, 01:10  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
Полный набор трэша Только там EFC
Пока не смотрел.

Разобрался как нужно создавать соединение с SQLite.
Немного проще вашего решения из EFConfiguration : DbConfiguration.
C#
8
9
10
11
12
13
14
15
16
17
18
    public class ContactsDB : DbContext
    {
        public ContactsDB(string pathAndNameDB)
            : base(
                  new SQLiteConnection(new SQLiteConnectionStringBuilder()
                      {
                          DataSource = pathAndNameDB
                      }
                      .ConnectionString),
                  true)
        {
0
296 / 120 / 33
Регистрация: 06.03.2016
Сообщений: 453
02.10.2021, 22:30
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Пока не смотрел.
Корявость там зашкаливает и бросается в глаза сразу - два класса с закосом под Core`вский Identity
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Немного проще
Достаточно SQLiteConnection получается? А пробовали туда, например, OleDb засунуть (к той же Access)?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,172
Записей в блоге: 2
02.10.2021, 23:29  [ТС]
Цитата Сообщение от ipsorokin Посмотреть сообщение
OleDb засунуть (к той же Access)?
Нет.
У меня времени (есть основная работа) не хватает с этим разобраться.

Добавлено через 51 секунду
Цитата Сообщение от ipsorokin Посмотреть сообщение
Достаточно SQLiteConnection получается?
Да.
Он же из System.Data.
Наверное, в нём уже есть все нужные настройки.
0
Заблокирован
10.03.2022, 20:06
А я решил (для начала) сделать выбор в пользу Microsoft.Data.Sqlite
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.03.2022, 20:06

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


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

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