ASP.NET Core — начало работы с Entity Framework

Самым известным, функциональным и широко используемым ORM в мире .NET является Entity Framework. Для работы с .NET Core была создана версия EF Core. Принцип работы EF Core остался тем же что у его предшественников, но это уже другая технология, так что сейчас ожидать полного набора функционала из Entity Framework 6 не приходится, но разработка проекта продолжается весьма активно. Из данной статьи вы узнаете как быстро приступить к использованию Entity Framework Core в ASP.NET Core проектах.

Для начала работы с EF Core необходимо установить необходимые библиотеки. Добавим пакеты Microsoft.EntityFrameworkCore.SqlServer и Microsoft.EntityFrameworkCore.Tools.

Установка NuGet библиотек Entity Framework Core

Для начала необходимо определиться с данными, которые будут храниться в базе данных. Я добавлю 2 класса User и Log, которые будут отвечать за данные пользователя и какие-то данные лога.

public class User
{
    [Key]
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}

public class Log
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long Id { get; set; }

    public DateTime UtcTime { get; set; }

    public string Data { get; set; }
}

После этого можно создать контекст для работы с базой данных:

class TestDbContext: DbContext
{
    public TestDbContext(DbContextOptions options)
        : base(options)
    { }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity()
            .HasIndex(b => b.Email);
    }

    public DbSet Users { get; set; }
    public DbSet Logs { get; set; }
}

DbContext — данный класс определяет контекст данных, используемый для работы с базой данных.

DbSet — представляет коллекцию всех сущностей указанного типа, которые содержатся в контексте или могут быть запрошены из базы данных.

Сейчас необходимо настроить подключение к базе данных. Для этого откроем файл Startup.cs и в метод ConfigureServices добавим строку:

services.AddDbContext(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

Строку подключения зададим в файле конфигурации, по умолчанию это appsettings.json

"ConnectionStrings": {
    "DefaultConnection": "СТРОКА_ПОДКЛЮЧЕНИЯ_ЗДЕСЬ"
}

Создание базы данных

Откроем Package Manager Console

И выполним команду Add-Migration InitialCreate

Это создаст файлы необходимые для создания структуры базы данных. Созданные файлы можно увидеть в созданной директории Migrations.

После этого выполним команду Update-Database и база будет создана.

Созданная MS SQL база данных

Добавление логирования запросов

Сейчас давайте добавим логирование для всех API запросов. Для этого добавим класс LoggingMiddleware со следующим содержанием:

public class LoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger _logger;

    public LoggingMiddleware(RequestDelegate next, ILogger logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task Invoke(HttpContext context, TestDbContext dbcontext)
    {
        if (context != null && context.Request.Path.ToString().ToLower().StartsWith("/api"))
        {

            using (var loggableResponseStream = new MemoryStream())
            {
                var originalResponseStream = context.Response.Body;
                context.Response.Body = loggableResponseStream;

                try
                {
                    var request = await FormatRequest(context.Request);
                    await _next(context);

                    var response = await FormatResponse(loggableResponseStream);

                    loggableResponseStream.Seek(0, SeekOrigin.Begin);

                    var newLog = new Log
                    {
                        Path = HttpUtility.UrlDecode(context.Request.Path + context.Request.QueryString),
                        UtcTime = DateTime.UtcNow,
                        Data = request,
                        Response = response,
                        StatusCode = context.Response.StatusCode,
                    };

                    await loggableResponseStream.CopyToAsync(originalResponseStream);

                    await dbcontext.Logs.AddAsync(newLog);
                    dbcontext.SaveChanges();
                }
                catch (Exception ex)
                {
                    //Здесь можно добавить логирование ошибок
                    throw;
                }
                finally
                {
                    context.Response.Body = originalResponseStream;
                }
            }
        }
    }

    private static async Task FormatRequest(HttpRequest request)
    {
        request.EnableRewind();
        string responseBody = new StreamReader(request.Body).ReadToEnd();
        request.Body.Position = 0;
        return responseBody;
    }

    private static async Task FormatResponse(Stream loggableResponseStream)
    {
        loggableResponseStream.Position = 0;
        var buffer = new byte[loggableResponseStream.Length];

        await loggableResponseStream.ReadAsync(buffer, 0, buffer.Length);

        return JsonConvert.SerializeObject(Encoding.UTF8.GetString(buffer));
    }
}

А в файле Startup.cs в методе Configure добавим:

app.UseMiddleware();

После этого все запросы, которые начинаются с /api будут логироваться в базу данных. Здесь стоит заметить, что вариантов логирования может быть множество. Здесь представлен лишь один из вариантов, который легко реализуем и не требует использования сторонних библиотек либо сервисов.

Еще добавим контроллер для работы с пользователями, добавим там метод для получения информации обо всех пользователях.

[Route("api/[controller]")]
public class UsersController : Controller
{
    private readonly TestDbContext _context;

    public UsersController(TestDbContext context)
    {
        _context = context;
    }

    [HttpGet]
    public async Task GetAll()
    {
        var users = await _context.Users.ToListAsync();
        return Ok(users);
    }
}

Это базовая информация, которая позволит вам быстро начать работать с Entity Framework Core.

Приятного программирования.

Добавить комментарий