Fakturační systém v C# .NET - LocalDB a Entity Framework

C# .NET Databáze Fakturační systém v C# .NET - LocalDB a Entity Framework

V tomto tutoriálu se naučíme vytvářet lokální databázi pro desktopovou aplikaci a její namapování na objekty pomocí Entity Frameworku. Půjde o jednoduché účetnictví. Je požadována alespoň základní znalost databází, SQL a práce s kolekcemi.

SQL CE

Do vydání Visual Studia 2013 se pro malé databáze desktopových programů používal SQL Server Compact Edition - jednoduchá verze SQL serveru tvořená pouze DLL soubory. Nepodporuje pohledy, uložené procedury, triggery a další. To nám u malé DB pro jednoduché ukládaní dat většinou stačí. Instalační soubor SQL CE má pouze kolem 2MB.

LocalDB

Od VS2013 nejde standardně vytvořit .sdf databáze pro SQL CE. Už se s CE nepočítá, i když to jde obejít pluginy. Proto si ukážeme, jak vytvořit lokální databázi LocalDB. Ta je už plnohodnotná (jako SQL server Express) a pro její spuštění na běžném PC (bez VS a SQL severu) musíme nainstalovat +- 30MB instalační soubor. Viz. tady(ENG).

Vytvoření databáze

Vytvoříme si nový konzolový projekt. Pro přidání databázového souboru máme pouze jednu možnost - soubor mdf.

Přidání databázového souboru v C# .NET

Nastavíme property databáze, aby se nám databáze přepsala pouze při změně její struktury a ne dat.

Vlastnosti databáze v C# .NET

Tvorba tabulek pro fakturační systém

Mějme tabulku faktura, která má dva cizí klíče na tabulku osoba. Ta reprezentuje dodavatele nebo odběratele.

Vytvoříme novou tabulku přes Server Explorer.

Vytvoření nové databázové tabulky

Tabulky můžeme naklikat nebo přímo napsat v SQL .

Tvorba databázových tabulek ve Visual Studio
Samotné SQL
CREATE TABLE [dbo].[Person]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY,
    [Name] NVARCHAR(100) NULL,
    [Surname] NVARCHAR(100) NOT NULL,
    [ICO] INT NULL,
    [DIC] NVARCHAR(20) NULL,
    [Street] NVARCHAR(100) NOT NULL,
    [City] NVARCHAR(100) NOT NULL,
    [PSC] INT NOT NULL,
    [Email] NVARCHAR(50) NOT NULL,
    [IsDeleted] TINYINT NOT NULL DEFAULT 0
)

CREATE TABLE [dbo].[Invoice]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY,
    [Supplier] INT NOT NULL,
    [Customer] INT NOT NULL,
    [Price] INT NOT NULL,
    [Service] NVARCHAR(200) NOT NULL,
    [Date] DATETIME NOT NULL,
    [InvoiceNumber] INT NOT NULL,
    [IsDeleted] TINYINT NOT NULL DEFAULT 0,
    CONSTRAINT [FK_Supplier] FOREIGN KEY ([Supplier]) REFERENCES [Person]([Id]),
    CONSTRAINT [FK_Customer] FOREIGN KEY ([Customer]) REFERENCES  [Person]([Id])
)

Parametr IDENTITY přidá autoinkrement primárního klíče. DEFAULT 0 nastaví defaultní hodnotu na 0. Propojení cizího klíče s primárním by vám mělo být jasné.

Entity Framework

Databázi máme hotovou. Nyní potřebujeme přistupovat k DB objektově.

Do projektu přidáme nový item ADO.NET Entity Data Model. Automaticky nám vygeneruje třídy a jejich vztahy podle DB. Je tu ještě možnost - vybrat EF DbContext Generator, ale tím se zde nebudeme zabývat (podle napsaných tříd přistupuje k DB nebo DB může i vygenerovat).

Entity Framework v C# .NET

Vybereme generování z databáze.

Entity Framework v C# .NET

Vybereme naši databázi

Entity Framework v C# .NET

Vybereme tabulky do kterých chceme přistupovat, zaškrtneme generování množných čísel u názvů objektů a klikneme na finish.

Entity Framework v C# .NET

Zobrazí se diagram naší databáze. Přejmenujeme si názvy referencí (Person1, Invoices1) ať se v tom pak vyznáme.

Entity Framework v C# .NET

Používání Entity Frameworku

Použití EF je velice jednoduché. Vytvoříme si instanci třídy DbInvoiceEntities. Ta obsahuje kolekce záznamů jednotlivých tabulek. Kolekce můžeme filtrovat, prohledávat atd. viz. zdejší tutoriály.

Přidání nového záznamu.

DbInvoiceEntities db = new DbInvoiceEntities();

Person newPerson = new Person();
newPerson.Name = "Jméno";
newPerson.Surname = "Příjmení";
newPerson.Street = "Ulice";
newPerson.City = "Město";
newPerson.PSC = 73601;
newPerson.ICO = 78321456;
newPerson.DIC = "CZ78321456";
newPerson.Email = "email@email.cz";

db.Persons.Add(newPerson);
db.SaveChanges();

Pokud objektu newPerson nenastavíme nějakou not null property, při spuštění se zobrazí výjimka.

Entity Framework v C# .NET

Jednoduchý výpis v konzoli s hledáním.

Console.WriteLine("Persons: ");
foreach (Person p in db.Persons)
{
    Console.WriteLine(p.Surname + " " + p.Name + ", city: " + p.City);
}
Console.WriteLine(Environment.NewLine);

Console.WriteLine("Invoices: ");
foreach (Invoice i in db.Invoices)
{
    Console.WriteLine("Price: " + i.Price + ", date: " + i.Date);
}
Console.WriteLine(Environment.NewLine + "Search Pepa: ");

Person foundPerson = db.Persons.FirstOrDefault(p => p.Name.Contains("pepa"));
Console.WriteLine(foundPerson.Surname + " " + foundPerson.Name + ", city: " + foundPerson.City);

Závěrem

V tomto tutoriálu jsme si ukázali, jak se v C# .NET vytváří a pracuje s lokální databází. Vytvořili jsme databázi a ORM pro jednoduchý fakturační systém. V dalším tutoriálu přidáme grafické rozhraní skrze Windows Presentation Foundation.

Pokuď vám něco nefunguje nebo něčemu nerozumíte, napište do diskuze, ať to můžu v článku případně poupravit.


 

Stáhnout

Staženo 639x (10.45 MB)

 

  Aktivity (1)

Článek pro vás napsal Petr Domes (petrds)
Avatar
Programuji v .NET. Ovládám C#, .ASP, WF, WPF, SQL

Jak se ti líbí článek?
Celkem (10 hlasů) :
4.64.64.64.64.6


 



 

 

Komentáře
Zobrazit starší komentáře (25)

Avatar
honza86
Člen
Avatar
honza86:

tak jsem nakonec tam nainstaloval sql tools i když jsem tam něco takového měl a vida jde :) díky za rady

 
Odpovědět  +1 23.10.2014 20:02
Avatar
honza86
Člen
Avatar
honza86:

Ahoj mám opět takový problém:) vytvořil jsem si okenní aplikaci, kde do textboxu píšu slova a ty se mi ukládaji do DB, udělanou na stejný způsob jak je v tomto článku a potom se vypisují do DataGridView to funguje dobře. Ale když chci označený záznam smazat tak si nevim rady. Snažil jsem se označený řádek převést na objekt a potom smazat z DB ale bohužel bez výsledku asi špatnej postup. Budu rád za každou rady. dík

 
Odpovědět 27.10.2014 15:33
Avatar
Odpovídá na honza86
Michal Štěpánek:

Hoď sem kód, jak tam ty data vkládáš a kód, jak se pokoušíš mazat. Když ten kód nevidím, nemůžu vědět co je špatně...

Odpovědět 27.10.2014 16:49
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
honza86
Člen
Avatar
honza86:
   public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnUloz_Click(object sender, EventArgs e)
        {
            SlovaEntities db = new SlovaEntities();
            Table newTable = new Table();
            newTable.slvova = txtSlovo.Text;
            db.Table.Add(newTable);
            db.SaveChanges();
            this.tableTableAdapter.Fill(this.slovaDataSet.Table);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: Tento řádek načte data do tabulky 'slovaDataSet.Table'. Můžete jej přesunout nebo jej odstranit podle potřeby.
            this.tableTableAdapter.Fill(this.slovaDataSet.Table);

        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //dataGridView1.DataSource = (LocalDB)\v11.0;AttachDbFilename="C:\Users\Honza\documents\visual studio 2013\Projects\OknoDB\OknoDB\Slova.mdf";Integrated Security=True;
        }

        private void btnSmazRadek_Click(object sender, EventArgs e)
        {
          //tady bych použil asi foreach kde by se našel označený řádek, a poté by se vyzal z DB, ale nevim jak
        }
    }
}
 
Odpovědět 27.10.2014 17:12
Avatar
honza86
Člen
Avatar
honza86:

databáze má jednu tabulku v které jsou sloupce Id a slvova (mělo to být slova,ale už se mi to nechtělo měnit).

 
Odpovědět 27.10.2014 17:21
Avatar
cz631642
Člen
Avatar
cz631642:

Zdravím
pokračuji krok za krokem při tvorbě databáze, ale při výběru v okně Entity Data Model Wizard nejde zaškrtnout výběr tabulky. Prostě do čtverečku se nedá dát fajfka. Neví někdo v čem může být chybka ?
Jan

 
Odpovědět 27.1.2015 23:15
Avatar
Martin Turner:

Ahoj Petře,

díky za pěkný tutoriál.
Rád bych si jen ujasnil pár drobností. S databázemi a Entity Frameworkem teprve začínám.
Jaká je běžná konvence v pojmenování tabulek (myslím jednotné nebo množné číslo)? Dočetl jsem se, že běžnější je používat množné číslo.
Chápu dobře, že pokud vytvořím objekty z databáze tohoto tutoriálu, tak třída Person reprezentuje tabulku Person? Tedy pokud budu mít tabulku nazvanou Persons, tak se stejně bude jmenovat i vygenerovaná třída ( a také kolekce ve třídě DbInvoiceEntities)? Pokud ano, je toto důvod proč jsi pojmenoval tabulky v jednotném čísle?
Díky za případnou reakci.

 
Odpovědět 14. března 15:04
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na Martin Turner
Marian Benčat:

neptate se me, ale dovolim si odpovedet.
Implicitne EF ma ve zvyku nazvy pluralizovat, tato konvence jde vypnout a take to udelejte, usetrite si tim pak problemy.. obecne proste pojmenovavejte tabulky jednotnym nazvem.. K tomu pojemonvani trid...

Pokud preci jen chcete mit tabulku Persons, tak pak mate tridu Person a v DBContextu (DbInvoiceEntities) máte

DBSet<Person> Persons{get; set;}

 
Odpovědět 15. března 1:02
Avatar
Karel Fojtík:

Ahoj, mám možná hloupý dotaz: do databáze jsem přidal data pomocí Server Exploreru přes Show Table Data -> New row...když v Program.cs udělám výpis, tak všechno vidím...když ale přidám nový objekt přes EF (v Program.cs) - v Server Exploreru v Show Data Table ho nevidím...Nevíte, co může být špatně? Díky.

 
Odpovědět 14. července 17:22
Avatar
Odpovídá na Karel Fojtík
Petr Domes (petrds):

Submitnul jsi ten nová objekt, refresh v server exploreru, správná DB ?

 
Odpovědět 14. července 18:07
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 35. Zobrazit vše