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
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 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 query = schoolContext.Courses.Where("it.DepartmentID == 1"); // misto it lze ObjectQuery explicite pojmenovat: /* ObjectQuery queryZaklad = schoolContext.Courses; queryZaklad.Name = "kurzy"; ObjectQuery query = schoolContext.Courses.Where("kurzy.DepartmentID==1"); */ // dotazy mozno parametrizovat: // ObjectQuery 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 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 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 list = rec[2] as List; 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 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