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
    
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.
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 optimalizuje
Pokud 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 database
Vytá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();