Web programozás és haladó fejlesztési technikák – C# SQL server elérése Entity Framework módszerrel
LocalDB létrehozása In-Solution In-Profile Adatok feltöltése Project / Add New Item / Service-based Database (ez SQL server file lesz. Local Database: SQL server compact file) Nekünk mindkettő jó, service-based-et használunk: EmpDept Előbb feltöltjük az adatbázist, majd azután generálunk osztályokat In-Profile Server Explorer -> Right click (Data Connections) -> Add Connection ( Microsoft SQL Server + .Net provider for SQL Server <OK>) Server name = (localdb)\v11.0 , Database name = EMPDEPT <OK> "Database does not exist. Attempt to create?" <YES> Akár a „Create New SQL Server Database” is jó, ugyanilyen lépésekkel Adatok feltöltése Új DB-re jobbkatt, New query A létrehozó SQL -ből mindent copypaste, Execute, ez után a query bezárható Új db/tables- re jobbkatt, refresh: táblák megjelennek A táblák minden futtatáskor visszaállnak az eredeti állapotra!
A modell legenerálása (SQL first) Előfeltétel: meglévő táblák http://msdn.microsoft.com/en-us/data/jj206878 Project, Add new Item, ADO.NET Entity Data Model <ADD> Generate from database <NEXT> Az MDF file legyen a legördülő menüben + save connection settings <NEXT>; EF6.0 <NEXT>; Mindegyik tábla mellett pipa + Model namespace = EmpDeptModel <FINISH> Konfigurációtól függően: Template can harm your computer, click ok to run ... <OK> <OK> Eredmény: automatikusan generált osztályok (mint DataSetnél), csak ezek nagyrészt generikus osztályok típusparaméterezett változatai vagy POCO osztályok ~30KB a két táblás adatbázis http://users.nik.uni-obuda.hu/hp/SQL_empdept.sql
1. Inicializálás ED = new EmpDeptEntities(); Console.WriteLine("Connect OK"); // DbSet<T> típus, LINQ bővítménymetódusokkal // LINQ query syntax is lehetséges // IEnumerable<T> vs IQueryable<T> DEPT reszleg = ED.DEPT.First(); Console.WriteLine(reszleg.DNAME); // Lazy loading string reszlegNeve = ED.EMP.First().DEPT.DNAME;
2. INSERT EMP ujdolg = new EMP() { ENAME = "BELA", MGR = null, DEPTNO = 20, EMPNO = 1000 }; ED.EMP.Add(ujdolg); ED.SaveChanges(); Console.WriteLine("Insert OK");
3. UPDATE EMP valaki = ED.EMP.Single(x => x.EMPNO == 1000); valaki.ENAME = "JOZSI"; ED.SaveChanges(); Console.WriteLine("Update OK");
4. DELETE EMP valaki = ED.EMP.Single(x => x.EMPNO == 1000); ED.EMP.Remove(valaki); ED.SaveChanges(); Console.WriteLine("Delete OK");
5. SELECT string s = "", sep=""; foreach (EMP dolg in ED.EMP.Where(dolgozo => dolgozo.SAL >= 3000)) { s += sep + dolg.ENAME; sep = ","; } Console.WriteLine(s); Console.WriteLine( string.Join(";", ED.EMP.Select(x => x.ENAME)) ); Cél: azon nevekkel feltölteni egy listboxot, akiknek a fizetése >= 3000
6. JOIN var dolgozok = from dolgozo in NE.EMP join reszleg in NE.DEPT on dolgozo.DEPTNO equals reszleg.DEPTNO select new { dolgozo.ENAME, dolgozo.SAL, reszleg.DNAME }; VAGY Lazy Loading kihasználásával: select new { dolgozo.ENAME,dolgozo.SAL,dolgozo.DEPT.DNAME Mindegy h hogyan állítom be az adatforrást
Táblák Oracle demo táblák
Feladatok Adjunk hozzá a projekthez egy „Service-Based Database” elemet EmpDept.mdf névvel, ezt töltsük föl az orademo.sql –ből, majd hozzunk létre Entity osztályokat! Határozzuk meg részleg nevenként a dolgozók átlagjövedelmét (jövedelem = fizetés+jutalék)! Határozzuk meg a legnagyobb (legtöbb főt foglalkoztató) részleg minden adatát! Melyik a legkisebb összfizetésű munkakör? / Írjuk ki a munkaköröket átlagfizetés szerinti sorrendben. Kik azok a dolgozók, akik az elnök felvétele utáni 30 napon belül lettek felvéve?
Források http://msdn.microsoft.com/en-us/library/bb882674 http://msdn.microsoft.com/en-us/library/ms254937 … és még soksok link az msdn.microsoft.com –ról … és még soksok link a stackoverflow.com –ról LINQ: Reiter István: C# jegyzet (http://devportal.hu/content/CSharpjegyzet.aspx) , 250. oldal (A könyv az alap LINQ to Objects-et tartalmazza)