Самым известным, функциональным и широко используемым 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
.
Для начала необходимо определиться с данными, которые будут храниться в базе данных. Я добавлю 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
и база будет создана.
Добавление логирования запросов
Сейчас давайте добавим логирование для всех 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.
Приятного программирования.