Recipe Book är en modern WinForms-applikation byggd med .NET 10 och C# för att hantera recept, ingredienser och kategorier via ett grafiskt användargränssnitt. Du kan även skriva ut recept direkt från applikationen.
Data lagras i en Microsoft SQL Server-databas och all databasinteraktion sker med Entity Framework Core för robust och asynkron hantering.
Applikationen är strukturerad i modulära klasser (Recipe, Ingredient, Category, RecipeIngredient, RecipeCategory) som kapslar in respektive domänfunktion. Tjänstelagret (RecipeService) hanterar CRUD-operationer och affärslogik, medan olika formulär (MainForm, CreateRecipeForm, EditRecipeForm, ShowForm) sköter UI och användarflöden. Utskriftsfunktionen finns i receptvyn.
Databasen skapas automatiskt vid start med tabeller, unika index och relationshantering (many-to-many) via kopplingstabeller. On-delete-beteenden och constraints säkerställer dataintegritet, och all dataoperation sker asynkront för bästa prestanda och användarupplevelse.
- Skapa recept: lägga till namn, beskrivning, instruktioner samt ingredienser och kategorier.
- Visa och söka recept: lista alla recept, sök och öppna detaljer för att se fullständig ingredienslista.
- Redigera recept: ändra receptdata, uppdatera mängder/enheter och ändra tillhörande kategorier.
- Ta bort recept: radera ett recept; kopplingar i
RecipeIngredientsochRecipeCategoriestas bort automatiskt. - Hantera ingredienser: skapa och uppdatera ingredienser med unika namn och standardenheter för återanvändning.
- Hantera kategorier: skapa och återanvänd kategorier med unika namn för enkel organisering.
- Skriv ut recept: Du kan skriva ut recept direkt från applikationen via utskriftsfunktionen i receptvyn.
- Många-till-många-relationer: stöd för flera ingredienser och kategorier per recept via kopplingstabeller.
- Asynkrona databasanrop: använder
SaveChangesAsync()för bättre respons i gränssnittet. - Automatisk databasuppsättning: databas och tabeller skapas vid första körning med
EnsureCreated()eller via migrationer. - Dataintegritet: unika index och on-delete-regler (cascade/restrict) säkerställer konsistens och förhindrar oavsiktlig borttagning.
RecipeBook/
├─ RecipeBook.csproj
├─ Program.cs
├─ Data/
│ └─ RecipeDbContext.cs
├─ Models/
│ ├─ Recipe.cs
│ ├─ Ingredient.cs
│ ├─ Category.cs
│ ├─ RecipeIngredient.cs
│ └─ RecipeCategory.cs
├─ Services/
│ ├─ RecipeService.cs
│ └─ RecipeFormHelper.cs
├─ Forms/
│ ├─ MainForm.cs
│ ├─ CreateRecipeForm.cs
│ ├─ EditRecipeForm.cs
│ └─ ShowForm.cs
├─ Assets/
│ └─ (bilder, ikoner)
├─ Migrations/
└─ README.md
- .NET SDK 10 (Target Framework:
net10.0) - Microsoft SQL Server (kan köras i Docker)
- Visual Studio eller VS Code med C#-stöd
git clone https://github.com/AlaaAlsous/recipebook.gitSe till att .NET SDK 10 är installerat.
- docker pull mcr.microsoft.com/mssql/server:2022-latest
- docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=Secret-Recipe-Book-Password!" -p 1433:1433 --name sqlserver -d mcr.microsoft.com/mssql/server:2022-latestSkapa databas och användare:
- docker exec -i sqlserver /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P "Secret-Recipe-Book-Password!" -Q "CREATE DATABASE recipe_book_db;" -C
- docker exec -i sqlserver /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P "Secret-Recipe-Book-Password!" -d recipe_book_db -Q "CREATE LOGIN [recipebook] WITH PASSWORD = 'Secret-Recipe-Book-Password!'; CREATE USER [recipebook] FOR LOGIN [recipebook]; ALTER ROLE db_owner ADD MEMBER [recipebook];" -Cdotnet tool install --global dotnet-ef
dotnet ef database updatedotnet run --project RecipeBook.csprojVid start öppnas huvudfönstret där du kan:
- Skapa nya recept med ingredienser och kategorier
- Söka, visa, redigera och ta bort recept
- Hantera ingredienser och kategorier
- Skriva ut recept
Databasen är designad för att hantera recept, ingredienser och kategorier med stöd för många-till-många-relationer. Nedan beskrivs tabeller, kolumner och relationer så som de faktiskt är implementerade:
-
Recipes
RecipeId(int, PK, auto-increment): Unikt ID för varje receptName(nvarchar(200), UNIQUE, NOT NULL): Namn på receptetDescription(nvarchar(1000), NULL): Beskrivning av receptetInstructions(nvarchar(2000), NULL): Instruktioner för tillagningCreatedAt(datetime2, NOT NULL): SkapandedatumUpdatedAt(datetime2, NOT NULL): Senaste ändringsdatum
-
Ingredients
IngredientId(int, PK, auto-increment): Unikt ID för varje ingrediensName(nvarchar(200), UNIQUE, NOT NULL): Namn på ingrediensenQuantityUnit(nvarchar(50), NOT NULL): Standardenhet för ingrediensen
-
Categories
CategoryId(int, PK, auto-increment): Unikt ID för varje kategoriName(nvarchar(100), UNIQUE, NOT NULL): Namn på kategorin
-
RecipeIngredients
RecipeId(int, FK): Referens tillRecipes.RecipeIdIngredientId(int, FK): Referens tillIngredients.IngredientIdQuantity(decimal, NOT NULL): Mängd av ingrediensenUnit(nvarchar(50), NOT NULL): Enhet (t.ex. g, ml, st)- Primärnyckel: (
RecipeId,IngredientId)
-
RecipeCategories
RecipeId(int, FK): Referens tillRecipes.RecipeIdCategoryId(int, FK): Referens tillCategories.CategoryId- Primärnyckel: (
RecipeId,CategoryId)
- Ett recept kan ha flera ingredienser och kategorier (many-to-many)
- Ingredienser och kategorier kan återanvändas i flera recept
- Kopplingstabellerna
RecipeIngredientsochRecipeCategorieshanterar dessa relationer
- Om ett recept tas bort:
- Relaterade poster i
RecipeIngredientsochRecipeCategoriestas bort (Cascade)
- Relaterade poster i
- Om en ingrediens eller kategori tas bort:
- Kan endast tas bort om de inte används i något recept (Restrict)
- Relaterade poster i kopplingstabeller tas inte bort automatiskt
- Relationer och on-delete-beteenden konfigureras i
RecipeDbContextmedmodelBuilderochFluent API. - Unika namn för recept, ingredienser och kategorier säkerställs med
HasIndex(...).IsUnique(). - Automatisk skapande av databas och tabeller via
EnsureCreated().
- Target Framework:
net10.0 - Paket:
Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.Design
Alaa Alsous
Språk: C#
Plattform: .NET 10
Verktyg: Visual Studio