Detta projekt är främst för personligt bruk och lärande.
Vi behöver bygga ett system som håller reda på utgifter! När en utgift läggs till ska vi kunna skriva in kostnad, datum, kategori och en beskrivning. Vi vill sen kunna visa alla utgifter, visa alla utgifter för en viss kategori, total kostnad, total kostnad per kategori.
Datan sparas med sqlite i Expenses.db, och läses av ExpenseDal
klassen, som öven kallas om man ska göra någon CRUD. Databasen har tre tabeller, en för expenses en för categories och en som länkar samman de två, så att en expense kan ha fler än en kategori.
i Models finns "entity" klasser som är baserade på tabellerna i databasen:
- Category.cs
- Expense.cs
- CategoryOfExpense.cs
Och "Views" som ärver av entity-klasserna
- ExpenseView.cs
- CategoryView.cs
Enda skillnaden är att Viewsen har en lista som motsvarar;
- för en utgift de associerade kategorierna, och
- för en kategori de associerade utgifterna.
Ett interface som håller reda på tre tabeller och översätter till vår app. I de konkreta implementationerna finns alla CRUD operationer för de två tabellerna, detta objektet föjer repository-mönstret.
Det finns två konkreta versioner:
Stor klass för att hålla reda på tre tabeller, skriven med ADO.NET.
Göra samma sak fast med dapper
I Program.cs finns lite kod för att testa ändra på databasen.
[Previous content remains unchanged]
Här är några exempel på hur du kan använda ExpenseDal-klassen för att interagera med databasen:
var dal = new ExpenseDal("Data Source=Expenses.db");
List<ExpenseView> expenses = dal.GetAllExpenses();
List<Category> categories = dal.GetAllCategories();
var catViews = dal.GetAllCategoryViews();
Notera skillnaden: GetAllCategories()
returnerar en enkel lista med kategorier, medan GetAllCategoryViews()
returnerar kategorier med tillhörande utgifter.
catViews.ForEach(category =>
Console.WriteLine(
category.Name + "\n\t" +
string.Join("\n\t", category.Expenses
.Select(e => e.Name).ToArray()
)
)
);
List<Category> categories = dal.GetAllCategories();
dal.AddExpense(
new Expense{
Name = "Shotgun",
Description = "Expensive, but oh so nice",
DateOfP = DateTime.Now,
},
[categories[5], categories[2]] // Lägg till i en specifik kategori
);
dal.DeleteExpense(expenses[0].Id);
dal.DeleteCategory(categories[2].Id);
static void Print(List<ExpenseView> expenseViews) =>
expenseViews.ForEach(expensesItem =>
Console.WriteLine(expensesItem.Name + "\n\t" +
string.Join("\n\t", expensesItem.Categories
.Select(c => c.Name).ToArray()
)
)
);
// Använd funktionen så här:
List<ExpenseView> expenses = dal.GetAllExpenses();
Print(expenses);
Salt
Groceries
Stuffff
Groceries
Expensive
Sugar
Groceries
Large Computer
Computer
Large things
Detta projekt är främst för personligt bruk och lärande.