Учебники по программированию показывают нам многообещающую землю, где все происходит так, как вы думаете; как только вы думаете. Но реальный мир в большинстве случаев работает не так. Здесь; вы часами отлаживаете какую-то ошибку CORS или думаете, почему столбец идентификатора таблицы базы данных не увеличивается автоматически. За последние 2 дня; Я участвую в интервью по программированию, которое длится 2 дня, и эта серия блогов основана на этом опыте — о чем я думаю на каждом этапе; в чем проблема и как я их решаю. Это вторая часть того.
Добавление контекста БД
namespace dev_test { public class DatabaseContext : DbContext { public DatabaseContext() : base() { public DbSet<User> Users { get; set; } public DbSet<Survey> Surveys { get; set; } public DbSet<Question> Questions { get; set; } public DbSet<Answer> Answers { get; set; } } }
В этот момент; при добавлении материала в файл DatabaseContext; была показана ошибка, и необходимо было добавить пакет nuget Microsoft.EntityFrameworkCore и соответствующие пакеты.
В файл appsettings.json добавлена следующая строка:
"ConnectionStrings": { "DBConnection": "server=(localdb)\\MSSQLLocalDB;database=dev_test;Trusted_Connection=true" }
Так как в проекте нет файла startup.cs; добавление следующей строки было невозможно.
services.AddDbContext<MyDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
В этот момент; изменил класс Program.cs, чтобы он выглядел следующим образом:
using dev_test; var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext<DatabaseContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
И получил следующую ошибку: DbContextOptionsBuilder не содержит определения для «usesqlserver» и метода расширения «usesqlserver». Установлены пакеты nuget и добавлено «использование Arch.EntityFrameworkCore»; перед файлом. Теперь появляется ошибка «параметры здесь не нулевые». Оказывается; «используя Arch.EntityFrameworkCore»; не было правильным решением; так и должно быть — "using Microsoft.EntityFrameworkCore;"
Разница между пакетами «Arch.EntityFrameworkCore» и «Microsoft.EntityFrameworkCore» заключается в том, что Arch.EntityFrameworkCore — это сторонний пакет, предоставляющий дополнительные функции поверх стандартного пакета Microsoft.EntityFrameworkCore. Он может содержать дополнительные классы, методы и функции, не включенные в пакет Microsoft.EntityFrameworkCore. С другой стороны, Microsoft.EntityFrameworkCore — это официальный пакет от Microsoft, предоставляющий основные функции для работы с Entity и базами данных в приложениях .NET. Он является основой для всех функций Entity Framework Core и обычно включается в качестве зависимости в другие пакеты, предоставляющие дополнительные функции.
После этого файл program.cs выглядит следующим образом:
using Microsoft.EntityFrameworkCore; using dev_test; var builder = WebApplication.CreateBuilder(args); var connectionString = builder.Configuration.GetConnectionString("DBConnection"); builder.Services.AddDbContext<DatabaseContext>(x => x.UseSqlServer(connectionString)); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); ...
Пытался запустить проект, но получил следующую ошибку -fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
An unhandled exception has occurred while executing the request.
Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorException: Ambiguous HTTP method for action - dev_test.Controllers.UserController.Get (dev_test). Actions require an explicit HttpMethod binding for Swagger/OpenAPI 3.0
Добавлены [HttpGet]
и [HttpPost]
перед действиями UserController
; и это сработало отлично.
Кроме того; удалили WeatherController по умолчанию и связанные с ним файлы.
При запуске этого проекта в Swagger; выдает следующую ошибку — System.InvalidOperationException: Unable to resolve service for type 'dev_test.Services.Contracts.IUserService' while attempting to activate 'dev_test.Controllers.UserController'.
Значит мы забыли прописать зависимости. После добавления их в нашу программу.cs; он отлично работает.
Однако возникает другая проблема; база данных не подключается, так как я пытаюсь подключиться через локальный сервер. Изменение "DBConnection": "server=(localdb)\MSSQLLocalDB;database=dev_test;Trusted_Connection=true"
на "DBConnection":"Server=localhost;Database=dev_test;Trusted_Connection=True;MultipleActiveResultSets=true,TrustServerCertificate=True"
решило проблему с подключением; но он выдает ошибку «Недопустимое значение для ключа« Несколько активных наборов результатов »».
Изменение еще раз на "DBConnection": "Server=localhost;Database=dev_test;Trusted_Connection=True;TrustServerCertificate=True"
решило проблему; но показывает «Неверное имя объекта «Пользователи». ошибка.
Оказывается; в БДконтексте; имя должно быть в единственном числе, а не во множественном числе, например:
using dev_test.DTOs; // WRONG CODE using Microsoft.EntityFrameworkCore; namespace dev_test { public class DatabaseContext : DbContext { public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options){} public DbSet<User> Users { get; set; } public DbSet<Survey> Surveys { get; set; } public DbSet<Question> Questions { get; set; } public DbSet<Answer> Answers { get; set; } } } using dev_test.DTOs; // RIGHT CODE using Microsoft.EntityFrameworkCore; namespace dev_test { public class DatabaseContext : DbContext { public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options){} public DbSet<User> User { get; set; } public DbSet<Survey> Survey { get; set; } public DbSet<Question> Question { get; set; } public DbSet<Answer> Answer { get; set; } } }
И для получения списка пользователей; подпись контроллера должна быть — public ActionResult> Get()
Наша пользовательская вставка пока работает; хотя это требует от нас каждый раз вручную указывать другой идентификатор. Нам нужно решить этот вопрос позже.
Но сначала; нам нужно создать наше внешнее приложение.
Давайте разберемся и воспользуемся командой angular-cli для создания углового проекта с роутингом.
Настройка углового проекта
Мы настраиваем угловой проект обычным способом; начните с проекта angular-cli; удалить файл app.component.html; добавим какой-нибудь свой компонент и настроим служебный файл для обращения к бэкенду. Первоначальная настройка может выглядеть так:
И всегда безобидный user-list.component.ts может выглядеть так:
import { Component, OnInit } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { HttpClientService } from 'src/app/http-client.service'; @Component({ selector: 'app-use-list', templateUrl: './use-list.component.html', styleUrls: ['./use-list.component.scss'] }) export class UseListComponent implements OnInit { userList = []; constructor(client: HttpClientService) { client.getData("user").subscribe((res) => console.log(res)); } ngOnInit(): void { } }
Но тут возникают проблемы. Во время работы над этим проектом; мы удобно встретили такой ошибкой -
Другие серии этого сериала:
Первая часть
Вторая часть
Третья часть
Четвертая часть
И код указан обновлен в —
Github