Jazyk C# - přístup k datům Katedra softwarového inženýrství Fakulta informačních technologií České vysoké učení technické v Praze Pavel Štěpán, 2011 Entity Framework BI-PCS Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 10 1/7
// Entity Framework je nejnovejsi technologie firmy MS pro tvorbu aplikaci, // ktere pracuji nad databazemi. (U MS se zjevne inspirovali projektem // NHibernate.) EF je vybudovan nad infrastrukturou ADO.NET, vykladaneho // v predchozi casti. Program v EF je mozno navrhnou tremi zpusoby. Bud se (vizualnimi nastroji EF) navrhne objektovy model aplikace a z neho se generuje jednak vlastni databaze a vazby mezi modelem a databazi. Druha moznost je vyjit z existujici database, z ni (vizualnimi nastroji) vytvorit objektovy model a vazby. Nejnoveji lze pouzit definice trid v programu a z nich generovat model a vazby using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; // pridano (nektere reference budou pridany az po vytvoreni modelu) using System.Data.Objects; using System.Data.Objects.DataClasses; using System.Data.Common; namespace CourseManager { public partial class Form1 : Form { public Form1() { InitializeComponent(); Entity model (soubor School.edmx) byl vytvoren z databáze vizualnimi nastroji Visual Studia.edmx obsahuje XML popisy> - entitniho modelu (cast CSDL - conceptual schema definition language) - databaze ci jineho uloziste (cast SSDL - store schema definitiv language) - mapovani mezi nimi (cast MSL - mapping specification language) private SchoolEntities schoolcontext; P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 10 2/7
private void Form1_Load(object sender, EventArgs e) { // inicializace ObjectContext schoolcontext = new SchoolEntities(); // pridani objektu do Engeneering schoolcontext.courses.addobject(course.createcourse(123, "Muj kurz",3,1)); // prime poslani SQL Commandu na podkladovou databazi!!!! // schoolcontext.executestorecommand( // "Insert Into dbo.course (...) values(...)"); // dotaz pro Entity Framework, ktery vraci vsechny objekty // Department a Courses, setridene podle jmena var departmentquery = from d in schoolcontext.departments.include("courses") orderby d.name select d; // vrati SQL, odesilana na DB txtsql.text = ((ObjectQuery)departmentQuery).ToTraceString(); try { // Navazeme (bind) combobox na definovanou query, ktera je // provedena behem faze data binding. // Aby se predeslo vicenasobnemu vykonavani query behem // bindingu,doporucuje se provadet binding controlu na vystupy // metody Execute departmentlist.displaymember = "Name"; departmentlist.datasource = ((ObjectQuery)departmentQuery).Execute(MergeOption.AppendOnly); catch (Exception ex) { MessageBox.Show(ex.Message); private void closeform_click(object sender, EventArgs e) { this.close(); // zavreni formu schoolcontext.dispose(); // uvolneni kontextu private void departmentlist_selectedindexchanged(object sender, EventArgs e) { // nacteme objekt pro zvoleny department Department department = (Department)departmentList.SelectedItem; // navazani DataGridu na kolekci objektu Course pro // vybrany object Department coursegridview.datasource = department.courses; P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 10 3/7
// Skryti sloupecku vazanych na navigacni vlastnosti objektu Course coursegridview.columns["department"].visible = false; coursegridview.columns["studentgrades"].visible = false; coursegridview.columns["onlinecourse"].visible = false; coursegridview.columns["onsitecourse"].visible = false; coursegridview.columns["people"].visible = false; coursegridview.columns["departmentid"].visible = false; coursegridview.allowusertodeleterows = false; coursegridview.autoresizecolumns( DataGridViewAutoSizeColumnsMode.AllCells); private void savechanges_click(object sender, EventArgs e) { try { schoolcontext.savechanges(); // ulozeni zmen do DB MessageBox.Show("Zmeny ulozeny"); this.refresh(); catch (Exception ex) { MessageBox.Show(ex.Message); private void btndotaz_click(object sender, EventArgs e) { // metody, vytvarejici Entity SQL: // vsechny kurzy // ObjectQuery<Course> query = schoolcontext.courses; // vykonani dotazu pouzitim v cyklu foreach txtvystup.clear(); foreach (Course polozka in query) { // lze pouzit i typ var txtvystup.text += polozka.courseid + "; " + polozka.title + "\r\n"; // zvoleni dotazem vypisovanych vlastnosti (sloupecku). // Pozor - vraci JINY typ (DbDataRecord) - ne Course! // Musi byt pridano using System.DataCommon; // ObjectQuery<DbDataRecord> query = schoolcontext.courses.select("it.courseid,it.title"); // it - odkaz na aktualni ObjectQuery; je mozno pouzit v // nasledujici ObjectQuery v retezu // (dotazy lze aplikovat sekvencne - dotaz na vysledek dotazu) P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 10 4/7
// podminka: // ObjectQuery<Course> query = schoolcontext.courses.where("it.departmentid == 1"); // misto it lze ObjectQuery explicite pojmenovat: ObjectQuery<Course> queryzaklad = schoolcontext.courses; queryzaklad.name = "kurzy"; ObjectQuery<Course> query = schoolcontext.courses.where("kurzy.departmentid==1"); // dotazy mozno parametrizovat: // ObjectQuery<Course> query = // schoolcontext.courses.where("it.departmentid == @did", // new ObjectParameter("dID",1)); // parametr je samozrejme mozno nastavit i mimo dotaz: ObjectParameter param = new ObjectParameter("dID", typeof(int)); //... ObjectQuery<Course> query = schoolcontext.courses.where("it.departmentid == @did", param); //... param.value = 1; // vyuziti navigacni vlastnosti - ("join") // Courses - navigacni vlastnost (kolekce pointeru na kurzy // daneho departmentu) ObjectQuery<DbDataRecord> query = schoolcontext.departments.select("it.departmentid, it.name, it.courses"); // lze i where txtvystup.clear(); // MergeOption.AppendOnly - jiz nactene hodnoty vzit z kontextu foreach (DbDataRecord rec in query.execute(mergeoption.appendonly)){ // zobrazit cislo a nazev departmentu: txtvystup.text += String.Format("{0; {1\r\n", rec[0], rec[1]); List<Course> list = rec[2] as List<Course>; foreach (Course kurz in list) { txtvystup.text += String.Format( " KurzID: {0, Nazev: {1\r\n", kurz.courseid, kurz.title); P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 10 5/7
// sort vysledku dotazu ObjectQuery<Course> query = schoolcontext.courses.orderby("it.title"); grdoutput.datasource = query; // lze i execute // zakazat nasledujici radky pro priklad s DbDataRecord grdoutput.columns["department"].visible = false; grdoutput.columns["studentgrades"].visible = false; grdoutput.columns["onlinecourse"].visible = false; grdoutput.columns["onsitecourse"].visible = false; grdoutput.columns["people"].visible = false; grdoutput.columns["departmentid"].visible = false; txtsql.text = query.totracestring(); P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 10 6/7
// Objektovy model, vytvoreny vizualnimi nastroji Entity Frameworku P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 10 7/7