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

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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 701x (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 (12 hlasů) :
4.666664.666664.666664.666664.66666


 



 

 

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

Avatar
Michal Štěpánek:

Záleží na tom, co by ta "jednoduchá aplikace" měla dělat, jaká by měla být struktura dat, jak často by se údaje měly měnit, kolik dat bude, atd. Možná by mohl stačit na data jen XML soubor, nebo nějaké jiné úložiště...

Odpovědět 15. ledna 8:32
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
slezak-petr
Člen
Avatar
slezak-petr:

No zas tak jednoduchá není, jedná se o "Autoservis" takže tabulky Zakaznik, Auto, Servis, ServisPolozky, Zbozi, Autodily, Objednavky, ObjednavkyPolozky a ještě asi deset dalších tabulek
Nechci se na začátku zaříznout, aby až budu chtít udělat webové rozhraní, abych to na na začátku neudělal špatně.
V tuto chvíli to mám v MS Access, ale zápasím s tím, že zákazník má Access 2016 (365) který je nestabilní než řešit Office, tak to asi přepíšu. Výhoda je ta, že mám jasno v struktuře dat ...
Už ten MS Access byl krok vedle, ale to je tak, když to chce mít zákazník "pod kontrolou" aby si to mohl spravovat sám ...

Editováno 15. ledna 18:16
Odpovědět 15. ledna 18:13
Čím víc se učím, tím víc mi přijde, že toho ještě mnoho neumím
Avatar
Odpovídá na slezak-petr
Michal Štěpánek:

Když plánuješ webové rozhraní, nepřemýšlel jsi o tom, že bys to udělal rovnou jako webovou appku? Nebo aspoň použít rovnou SQL DB na nějakém webhostingu, kam bys později přidal tu webovou nadstavbu?

že zákazník má Access 2016 (365)

to přece řešit nemusíš, tobě stačí dát do programu knihovny, které s Acessem dělají a DB budeš mít jen jako soubor. K tomu není třeba, aby zákazník vůbec nějaké office měl...

Odpovědět 16. ledna 11:18
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
slezak-petr
Člen
Avatar
Odpovídá na Michal Štěpánek
slezak-petr:

Ano, ale asi to znáš, vždy je to o zákazníkovi, DB na webhostingu jsem nabízel,
ale "bojí se o citlivá obchodní data" proto LOCAL DB na jeho PC
Někteří lidé stále preferují WIN FORM, proto WPF, ale vím, že budoucnost je na webu,
ale na to zákazník musí uzrát

Ohledně Access nechápu (neznám) problém není v DTB ale v tom, že Access jako klient padá (nestabilní Office 2016)
Zkus popsat "Access a knihovny" - logika je v DLL C# a Access je jen vizualizace?
Pls odkazy, příklad ...

Odpovědět 16. ledna 11:28
Čím víc se učím, tím víc mi přijde, že toho ještě mnoho neumím
Avatar
Odpovídá na slezak-petr
Michal Štěpánek:

Kdysi jsem taky dělal appku s databází MS Access a na cílovém PC vůbec nebyl Access nainstalovaný. Jen jsem si přidal reference na knihovny (aktuálně nabízí VS tuto - Microsoft Access 14.0 Object library) a MDB soubor jsem přiložil k appce (samozřejmě do ProgramData, protože v ProgramFiles by se musely ošetřovat práva k zápisu)

Odpovědět 16. ledna 11:33
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
slezak-petr
Člen
Avatar
Odpovídá na Michal Štěpánek
slezak-petr:

OK ano, rozumím, místo dtb.MDF byla dtb.MDB a zbytek byl v C#
Tady to celé vzniklo tak, že zákazník chtěl "aplikaci rozumět, kontrolovat a spravovat"
a trochu se vyznal ve VBA (Office - Visual basic for Application)
Moje chyba, neměl jsem to dopustit.
Každopádně díky za info

Odpovědět 16. ledna 12:09
Čím víc se učím, tím víc mi přijde, že toho ještě mnoho neumím
Avatar
Odpovídá na slezak-petr
Michal Štěpánek:

Tady to celé vzniklo tak, že zákazník chtěl "aplikaci rozumět, kontrolovat a spravovat"

Rozumět, kontrolovat a spravovat ano, ale podle mě by neměl mít přístup do databáze mimo aplikaci, protože tam může napáchat nedozírné a nevratné škody...

Odpovědět 18. ledna 13:56
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Karel Fojtík:

Děkuji problém vyřešen - DB se aktualizovala ve složce Debug/Release - takže špatná DB.

 
Odpovědět 21. února 19:58
Avatar
Karel Fojtík:

Chtěl bych se zeptat - mám program velmi podobný programu vytvořenému tady - Přes Publish jsem vytvořil ClickOnce instalační soubor. Na jiném PC kde je nainstalované VS a LocalDB je přístup k databázi bezproblémový. Na dalším PC, kde je jenom LocalDB nemůžu k databázi přistupovat a výjimka vyhazuje chybu "The underlying provider failed on Open"...Neřešil někdo tento problém - nevíte jakou komponentu na klientském PC doinstalovat?

 
Odpovědět 21. února 20:09
Avatar
Odpovídá na Karel Fojtík
Michal Štěpánek:

Zkus zkontrolovat architekturu cílového počítače (32/64bit) a koukni se, jestli máš správně nastaven výstup z VS. Já používám x86, protože při nastavení "AnyCPU" mi to na některých strojích blblo...
Pak se ještě mrkni, zda v prográmku nepoužíváš nějakou knihovnu, kterou jsi nezakomponoval do výstupu a která případně na tom PC není...

Odpovědět 22. února 7:22
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
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 46. Zobrazit vše