Учебники по программированию показывают нам многообещающую землю, где все происходит так, как вы думаете; как только вы думаете. Но реальный мир в большинстве случаев работает не так. Здесь; вы часами отлаживаете какую-то ошибку 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