# Entities and DbContext — .NET Core: Build, Test and Ship Web APIs

Source: https://www.geekswithgeeks.com/en/dotnet-core/ef-model-dbcontext

> Define an entity, a DbContext and register it with a connection string.

## The DbContext

EF Core is an object-relational mapper. A `DbContext` represents a session with the database, and each `DbSet<T>` property represents a table. It tracks the changes you make and writes them on `SaveChanges`.

## Code to database

Entity classes map to tables, migrations change the schema, and LINQ queries become SQL.

![Four stages from model to stored rows.](assets/figures/dotnet-core/section-6-map.svg) — Figure 6.1 — Model, migration, database, query.

## A small model

SQLite keeps the example simple; the same code works with SQL Server or PostgreSQL by swapping the provider package.

```csharp
public class Book
{
    public int Id { get; set; }
    public required string Title { get; set; }
    public decimal Price { get; set; }
}

public class ShopDb(DbContextOptions<ShopDb> options) : DbContext(options)
{
    public DbSet<Book> Books => Set<Book>();
}

// Program.cs
builder.Services.AddDbContext<ShopDb>(o =>
    o.UseSqlite(builder.Configuration.GetConnectionString("Default")));
```

## Keep DbContext scoped

`AddDbContext` registers it as scoped, and that is correct: it is not thread-safe, so never share one instance between concurrent requests.

**Quiz:** What does a DbSet<Book> property usually represent?

- [ ] A database server
- [x] A table of books
- [ ] A migration file
- [ ] A connection string

*Answer:* A table of books. Each `DbSet<T>` maps to a table (or view) holding rows for the entity type.
