Programování
Databaze
Entity framework mapuje objekty na objekty v databazi
Pro propojení je potřeba nainstalovat nugetku MySql.EntityFrameworkCore
Na dostaní se na litv MySql server je potřeba mít zaplou VPN a odkaz je: http://mysqlstudenti.litv.sssvt.cz
Nebo je možné spustit lokální mySql server kde stačí zapnout aplikaci s jménem xamp: potom adresa je localhost
ORM = Objektově relační mapování = na každý objekt je třída
Lepší vysvětlení zde
Chce používat metodu database first a následně si vlastnoručně tabulky vytvořit.
Pro propojení je potřeba nainstalovat nugetku MySql.EntityFrameworkCore
Na dostaní se na litv MySql server je potřeba mít zaplou VPN a odkaz je: http://mysqlstudenti.litv.sssvt.cz
Nebo je možné spustit lokální mySql server kde stačí zapnout aplikaci s jménem xamp: potom adresa je localhost
ORM = Objektově relační mapování = na každý objekt je třída
Lepší vysvětlení zde
public class MyContext : DbContext
{
// Kolekce obsahujicí data, pracujeme s ní jako s listem
// Hledá tabulku s názvem "Articles"
public DbSet<Articles> Articles { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL("server=mysqlstudenti.litv.sssvt.cz;database=yourdatabase;user=yourusername;password=yourpassword;SslMode=none");
}
}
Návod v PDF od profesora
Chce používat metodu database first a následně si vlastnoručně tabulky vytvořit.
Tabulky
Tabulka je vlastně jedna třída
// Pokud máme jiný název tabulky
[Table("tbArticles")]
public class Article
{
// Definujeme, že je primarní klíč (dobrovolný)
[Key]
public int Id {get;set;}
[Collumn("Nazev")] // Pokud chceme mame jiny nazev
public string Title {get;set;}
public string Content {get;set;}
public int CategoryId {get;set;}
}
// Pokud máme jiný název tabulky
[Table("tbCategories")]
public class Category
{
// Definujeme, že je primarní klíč (dobrovolný)
[Key]
public int Id {get;set;}
// Pokud chceme mame jiny nazev
[Collumn("Nazev")]
public string Title {get;set;}
// Označíme na jaký Id to pasuje
[ForgeinKey("CategoryId")]
public List<Article> articles {get;set;}
}
Práce s contextem
Nejlepší je používat repository, ale to zabere čas než se napíše.
Pokud je problém s Linq a nedokážete ho pochopit, doporučuju TutorialsTeacher.com
Vytáhnout > pozměnit > uložit
Projetí všech objektů
MyContext context = new MyContext();
foreach(Article item in context.Articles)
{
Console.WriteLine(item.Title)
}
//Pokud chceme načíst počet categorii na articles tak přes Include()
foreach(Category item in context.Category.Include(x => x.articles))
{
Console.WriteLine(item.articles.Count())
}
Více na include zde
Hledání určitého objektu
MyContext context = new MyContext();
//Najde prvni objekt (podle primárního klíče)
Article a = context.Articles.Find(1);
Console.WriteLine(a.Content)
Linq
Používání LinQ, entity framework optimalizujePokud je problém s Linq a nedokážete ho pochopit, doporučuju TutorialsTeacher.com
MyContext context = new MyContext();
foreach(Article item in context.Articles.Where(x => x.Id < 2))
{
Console.WriteLine(item.Title)
}
Přidávání
MyContext context = new MyContext();
context.Articles.Add(new Articles() {Title = "Test", Content = "xxxx"});
// Je nutné uložit, jinak se nic nepropíše
context.SaveChanges()
Odstranění
MyContext context = new MyContext();
// Najit co chceme pryč
Article a = context.Articles.Find(3);
// Odstranit
context.Articles.Remove(a);
// Uložit
context.SaveChanges()
Změny
Dokud je reference na ten daný objekt tak se po saveChanges() propojí do databaseVytáhnout > pozměnit > uložit
MyContext context = new MyContext();
// Najit co chceme změnit
Article a = context.Articles.Find(3);
// uprava
a.Title = "Změna";
// Uložit
context.SaveChanges()
Sql raw
Je možné pouštět sql dotazy.
//Vratí list všechn articlů
List<Articles> articles = context.Articles.FromSqlRaw("select * from Articles").ToList();
//Nebo jde taky spouštet sql commandy na serverový urovni
context.FromSqlRaw("select * from sys.Tables")
SQL injection
Jedná se o to, že muže uživat vkládat text do našeho sql query a tím uvádíme celou databázi do ohrožení. Například muže vložit "delete * from Articles". Za tohle je okamžitá 5, pokud to tam necháte
// Velmi špatně !!!!!!,
// uživatel muže předat příkazy přes toto
// Například "', DELETE FROM Articles; -- "
var title = Console.ReadLine();
List<Articles> articles = context.Articles.FromSqlRaw($"select * from Articles where Title = '{title}'").ToList();
// Tohle je správné řešení:
List<Articles> articles = context.Articles.FromSqlRaw("select * from Articles where Title = {0}", title).ToList();