Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
3 / 4 / 0
Регистрация: 19.09.2016
Сообщений: 91

Работа C# с SQLite

21.11.2019, 15:01. Показов 1239. Ответов 1

Студворк — интернет-сервис помощи студентам
Уважаемые форумчане! Помогите решить задачу.
Создал тестовый пример для изучения работы взаимодействия C# EntityFramework с БД на SQLite. Погуглив, нашел множество примеров по взаимодействию, но к сожалению во всех примерах используется БД с одной таблицей. Как только создаешь таблицу к примеру со связью один ко многим, начинается проблема, ничего не работает. И к сожалению ничего не понятно где ошибка, то ли в самой БД то ли в запросе.
Давайте разберем пример.
Первым делом создаем проект в VStudio. Через NuGet загружаю EntityFramework и 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
30
public class Course
    {
        public Course()
        {
            Students = new List<Student>(); //Связь многие ко многим или один ко многим
        }
 
        public int Id { get; set; }
 
        public string Name { get; set; }
 
        public string Url { get; set; }
 
       
        public virtual ICollection<Student> Students { get; set; } // связь один ко многим
    }
 
    public class Student
    {
        public int Id { get; set; }
 
        public string FirstName { get; set; }
 
        public string LastName { get; set; }
 
        public int CourseId { get; set; }
 
        
        public virtual Course Course { get; set; }  /// Связь между классом  Studen и Course один ко многим
    }
В файле App.config прописываю строки подключения к БД :
XML
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
<!--Добавляем строку-->
  <connectionStrings>
    <!--<add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Server=.\sqlexpress;Database=Coursera;Trusted_Connection=True;" />-->
    <!--<add name="DefaultConnection" connectionString="Data Source=|DataDirectory|Coursera.sqlite" providerName="System.Data.SQLite.EF6" />-->
    <add name="DefaultConnection" connectionString="Data Source=.\Coursera.db" providerName="System.Data.SQLite" />
  </connectionStrings>
  <!--Конец добавлению-->
 
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
 
      <provider invariantName="System.Data.SQLite"  type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>
 
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite.EF6" />
      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
      <remove invariant="System.Data.SQLite" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>
Создаем DbContext:

C#
1
2
3
4
5
6
7
8
9
10
11
public class CourseraContext : DbContext
    {
 
        public CourseraContext(): base("DefaultConnection")
        {
        }
 
        public DbSet<Course> Courses { get; set; }
 
        public DbSet<Student> Students { get; set; }
    }
С помощью DB Browser создаю БД с именем Coursera.db и с двумя таблицами:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE "Courses" (
    "Id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    "Name"  TEXT,
    "Url"   TEXT
);
 
CREATE TABLE "Students" (
    "Id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    "FirstName" TEXT,
    "LastName"  TEXT,
    "CourseId"  INTEGER,
    FOREIGN KEY("CourseId") REFERENCES "Courses"("Id")
);
Далее в Main пишем код:

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
int option = -1;
            while (option != 0)
            {
                Console.WriteLine("Выберите опцию - Choose an option (0, 1, 2):" + Environment.NewLine +
                                  "1. Введите курс - Enter a course" + Environment.NewLine +
                                  "2. Введите студента - Enter a student" + Environment.NewLine +
                                  "3. Перечислите все курсы - List all courses" + Environment.NewLine +
                                  "4. Перечислите всех студентов - List all students" + Environment.NewLine +
                                  "0. Exit" + Environment.NewLine);
                if (int.TryParse(Console.ReadLine(), out option))
                {
                    switch (option)
                    {
                        case 1:
                            EnterCourse();
                            break;
 
                        case 2:
                            EnterStudent();
                            break;
 
                        case 3:
                            ListAllCourses();
                            break;
 
                        case 4:
                            ListAllStudents();
                            break;
                    }
                }
            }
            Console.WriteLine("Нажмите любую клавишу, чтобы выйти - Press any key to quit...");
            Console.ReadLine();
        }
 
        /// <summary>
        /// Вывести список всех студентов
        /// </summary>
        private static void ListAllStudents()
        {
            using (var db = new CourseraContext())
            {
                foreach (Student stud in db.Students)
                {
                    Console.WriteLine(string.Format($"Студент: {stud.Id} * {stud.FirstName} * {stud.LastName} * {stud.Course}"));
                }
            }
        }
 
        /// <summary>
        /// Вывести все курсы
        /// </summary>
        private static void ListAllCourses()
        {
            using (var db = new CourseraContext())
            {
                foreach (Course course in db.Courses)
                    Console.WriteLine(string.Format("Курс - Course: {0} - {1}", course.Id, course.Name) + Environment.NewLine);
            }
        }
 
        /// <summary>
        /// Ввести студента
        /// </summary>
        private static void EnterStudent()
        {
           
            string firstName = "";
            string lastName = "";
            int _idCourse = 0;
 
            while (firstName != "0")
            {
                Console.WriteLine("Введите имя студента");
                firstName = Console.ReadLine().Trim();
                Console.WriteLine("Введите фамилие студента");
                lastName = Console.ReadLine().Trim();
                Console.WriteLine("Введите номер ID курса");
                _idCourse = Convert.ToInt32( Console.ReadLine().Trim());
 
                using (var db = new CourseraContext())
                {
                    Course course = new Course();
                    Student student = new Student();
 
                    student.Course = course;
                    student.FirstName = firstName;
                    student.LastName = lastName;
 
                    db.Students.Add(student);
                    db.SaveChanges();
 
                }
 
            }
 
        }
 
        /// <summary>
        /// Ввеcти курс
        /// </summary>
        private static void EnterCourse()
        {
            string name = "";
 
            while (name != "0")
            {
                Console.WriteLine("Введите название курса - Enter name of course (0 to exit):");
                name = Console.ReadLine().Trim();
 
                if (name != "0")
                {
                    using (var db = new CourseraContext())
                    {
                        Course course = new Course();
                        course.Name = name;
                        db.Courses.Add(course);
                        db.SaveChanges();
                    }
                }
            }
        }
    }
Вот в принципе, но к сожалению не работает. Подскажите что не так делаю.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.11.2019, 15:01
Ответы с готовыми решениями:

Работа с SQLite
Здравствуйте, я делаю курсовую работу на java, моя тема &quot;Домашняя бухгалтерия&quot;. Не подскажите как мне организовать мою БД, какие там должны...

Работа с SQLite
Здравствуйте, я делаю курсовую работу на java, моя тема &quot;Домашняя бухгалтерия&quot;. Не подскажите как мне организовать мою БД, какие там должны...

Работа с SQLite
Дорогие ребята, уже много часом, нет даже дней, провел в поисках доходчивого примера как работать с базой данных SQLite. Вы моя последняя...

1
3 / 4 / 0
Регистрация: 19.09.2016
Сообщений: 91
21.11.2019, 15:10  [ТС]
Файл примера
Вложения
Тип файла: rar SQLite_EF_Console0.rar (22.77 Мб, 7 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.11.2019, 15:10
Помогаю со студенческими работами здесь

Работа с SQLite
В приложении нужна база данных без дополнительных установок ПО. Выбор пал SQLite. И так нашел в интернете FAQ по ней: тык И так я...

Работа с SQLite
Добрый день! Подскажите кто работал с SQLite. Как работать со связями в этой БД, к примеру связи один ко многим и тд . Почему то погуглив...

Работа с БД SQLite
Помогите пожалуйста понять в чем дело !!! Задача в том, что нужно считать из файла формата txt информацию. Первая строка - Сылка на файл...

Работа с SQLite
Добрый день. Я новичок в разработке под андроид и экспериментируя натолкнулся на такой вопрос В самом Activity отображаю таблицу ...

Работа с SQLite
Привет, надо сделать одно приложение, я прочитал что SQLite работает автономно(не требует сервер). 1)Подскажите как работает с SQLite...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru