105 lines
4.2 KiB
Markdown
105 lines
4.2 KiB
Markdown
# Entity Framework - Dead Ball Zone
|
|
This is a practice project to learn Entity Framework.
|
|
|
|
Using the 1998 game [Dead Ball Zone](https://en.wikipedia.org/wiki/Dead_Ball_Zone) for inspiration.
|
|
|
|
## .NET commands:
|
|
|
|
### NuGet commands
|
|
|
|
Install [Entity Framework Core NuGet package](https://www.nuget.org/packages/microsoft.entityframeworkcore):
|
|
|
|
`dotnet add package Microsoft.EntityFrameworkCore --version 9.0.3`
|
|
|
|
### Creation commands
|
|
|
|
To list all available templates:
|
|
|
|
`dotnet new -l`
|
|
|
|
New class:
|
|
|
|
`dotnet new class -n MyClass`
|
|
|
|
adding to an existing solution:
|
|
|
|
`dotnet sln add Data/Data.csproj`
|
|
|
|
### Entity Framework commands
|
|
|
|
Create a migration, inside of the Console project, referring to the Data project:
|
|
|
|
`dotnet ef migrations add InitialMigration --startup-project ./ --project ../EntityFrameworkCore.Data`
|
|
|
|
Update the database:
|
|
|
|
`dotnet ef database update --startup-project ./ --project ../EntityFrameworkCore.Data`
|
|
|
|
Database-first scaffolding example: *(no need for escape slashes)*
|
|
|
|
`Scaffold-DbContext 'connection-string' Microsoft.EntityFrameworkCore.SqlServer -ContextDir ScaffoldDbContext -OutputDir ScallfoldModels`
|
|
|
|
`dotnet ef dbcontext scaffold "connection-string" Microsoft.EntityFrameworkCore.SqlServer --context-dir ScaffoldDbContext --output-dir ScaffoldModels --startup-project ./ --project ..\EntityFrameworkCore.Data\`
|
|
|
|
Using `-force` parameter to force overrides when scaffolding.
|
|
|
|
## Links
|
|
|
|
* [Entity Framework - Database providers](https://learn.microsoft.com/en-us/ef/core/providers/?tabs=dotnet-core-cli)
|
|
|
|
## Terms
|
|
|
|
A **database-context** is an abstraction of the database structure in code.
|
|
* It lists the models and their database table names.
|
|
* It instantiates a database connection during the runtime of the application.
|
|
* Allows configurations to be made in code.
|
|
|
|
The **migrations** provide a version-controlled method to maintain the state of the database.
|
|
* It is possible to track when, and by who changes were made.
|
|
* In the Up method, it is described which changes should be made.
|
|
* in the Down method, it is described which changes should be undone. This allows rollback.
|
|
* There is a history table that is kept by default to track migrations.
|
|
|
|
## Installed NuGet packages
|
|
|
|
A list of installed NuGet packages in this application.
|
|
|
|
Note that the [Microsoft.EntityFrameworkCore.Tools](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Tools/9.0.3) is used for Powershell commands used in the Package Manager Console for Visual Studio and that [Microsoft.EntityFrameworkCore.Design](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Design/9.0.3) is used for cross-platform command tools.
|
|
|
|
### Console project
|
|
|
|
[Microsoft.EntityFrameworkCore.Tools](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Tools/9.0.3)
|
|
|
|
* `dotnet add package Microsoft.EntityFrameworkCore.Tools --version 9.0.3`
|
|
|
|
### Data project
|
|
|
|
[Microsoft.EntityFrameworkCore](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/9.0.3)
|
|
|
|
* `dotnet add package Microsoft.EntityFrameworkCore --version 9.0.3`
|
|
|
|
[Microsoft.EntityFrameworkCore.Sqlite](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite/9.0.3)
|
|
|
|
* `dotnet add package Microsoft.EntityFrameworkCore.Sqlite --version 9.0.3`
|
|
|
|
## Tips for efficient querying
|
|
|
|
* Use indexes.
|
|
* Use projections.
|
|
* Limit result set (skip and take)
|
|
* Use async calls.
|
|
* Use `FromSQLRaw()` for an optimized query if it gets complex in LINQ.
|
|
* Use no-tracking.
|
|
* Use batch operations.
|
|
|
|
### Tracking
|
|
|
|
Tracking works best when the same DbContext is used for both querying and changing entities. EF Core automatically tracks the state of the queried entities and detects any changes made, until `SaveChanges()` is called, which is a method to save pending changes to the database. These changes are detected with the `DetectChanges()` function. This function can be manually called, to see what the changes are, but it is automatically called by the `SaveChanges()` function. `SaveChanges()` is transactional (for most providers).
|
|
|
|
The following states are tracked in the `EntityState.State` property:
|
|
* **Detached**: entity is not tracked.
|
|
* **Added**: new entity, not yet added to the database.
|
|
* **Unchanged**: no changes to the entity.
|
|
* **Modified**: changes are made to the entity.
|
|
* **Deleted**: the entity is in the database, but is marked for deletion.
|