ΑΝΩΤΑΤΟ ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΛΑΡΙΣΑΣ ΤΜΗΜΑ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ



Σχετικά έγγραφα
Εισαγωγή στην εφαρμογή Βασική Σελίδα (Activity) Αναζήτηση Πελάτη... 6 Προβολή Πελάτη... 7 Επεξεργασία Πελάτη... 10

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

XAMPP Apache MySQL PHP javascript xampp

4 η Εργαστηριακή Άσκηση

Σχεδιάζοντας Εφαρμογές για το Διαδίκτυο

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010

ΔΗ Μ Ι Ο ΥΡ Γ Ι Α W I K I με τ η χρήση τ η ς υπ ηρεσίας h t t p : / id ot.com /

Οδηγίες Χρήσης της MySQL

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

Σχεδιάζοντας Εφαρμογές για το Διαδίκτυο

ANDROID Προγραμματισμός Εφαρμογών

Σημειώσεις για τις Ιστοσελίδες του Google

1. Άνοιγμα Και Κλείσιμο Της Εφαρμογής Φυλλομετρητή Ιστού (Internet Explorer)

Εισαγωγή στην ASP.NET. Σημειώσεις Σεμιναρίου Επιμέλεια: Βασίλης Κόλιας 4.0

Field Service Management ΕΓΧΕΙΡΙΔΙΟ ΧΡΗΣΗΣ

Αντικειμενοστρεφής Προγραμματισμός

9η Εργαστηριακή Άσκηση: Stored Procedures - Triggers. Αποθηκευμένες Διαδικασίες (Stored Procedures):

Μπορείτε τα δείτε βιντεάκι με τη διαδικασία εδώ:

PRISMA Win POS Sync Merge Replication

server : Ο υπολογιστής του καθηγητή που θέλουμε να ελέγχει τους υπόλοιπους του εργαστηρίου client : Οι υπολογιστές των μαθητών

Βάσεις δεδομένων (Access)

Οδηγίες Χρήσης της MySQL

Βρίγκας Μιχαήλ Α.Μ.744 Μπράχος Χ. Ευάγγελος Α.Μ.795

Δημιουργία μιας εφαρμογής Java με το NetBeans

ΤΕΙ ΚΑΒΑΛΑΣ. Πτυχιακή εργασία ΕΙΣΑΓΩΓΗ. Μιλτιάδης Κακλαμάνης

Εργασία για το Facility Game Μάθημα: Δομές Δεδομένων Σωτήρης Γυφτόπουλος

Βάσεις δεδομένων (Access)

Λίγα λόγια από το συγγραφέα Κεφάλαιο 1: Βάσεις δεδομένων και Microsoft Access Κεφάλαιο 2: Microsoft Access

Πως θα κατασκευάσω το πρώτο πρόγραμμα;

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010

Σχεδίαση Βάσεων Δεδομένων

ΕΓΧΕΙΡΙΔΙΟ ΟΔΗΓΙΩΝ ΧΡΗΣΤΗ. Ηλεκτρονική Υποβολή Α.Π.Δ.

Java & Java EE 3o Μέρος: Διασφάλιση ασφάλειας σε εφαρμογές Java Enterprise Edition. Κακαρόντζας Γεώργιος

Ξεκινώντας με το MIT Αρρ Inventor. 1 η Εργασία

ΑΣΚΗΣΗ 1: TO ΠΕΡΙΒΑΛΛΟΝ ΕΡΓΑΣΙΑΣ DEV-C++

Αικατερίνη Καμπάση, PhD. Τμήμα Προστασίας και Συντήρησης Πολιτισμικής Κληρονομιάς Α.Τ.Ε.Ι. Ιονίων Νήσων

Οδηγός Εγκατάστασης και Χρήσης του Arebas Easy

1. O FrontPage Explorer

JOOMLA CMS ΒΑΣΙΚΗ ΠΑΡΑΜΕΤΡΟΠΟΙΗΣΗ (PART I)

2 η Εργαστηριακή Άσκηση

Εργαστήριο #12. Βήμα 1 ο. Βήμα 2 ο. Βήμα 3 ο. Βήμα 4 ο.

APP INVENTOR ΟΔΗΓΟΣ 8 Οκτωβρίου 2018

Εργαστήριο «Τεχνολογία Πολιτισμικού Λογισμικού» Ενότητα. Επεξεργασία πινάκων

ΜΑΘΗΜΑ Άνοιγμα Της Εφαρμογής Επεξεργασίας Κειμένου. 2. Κύρια Οθόνη Της Εφαρμογής Κειμένου ΣΤΟΧΟΙ:

NetBeans και σχετικά προγράμματα. Κακαρόντζας Γεώργιος Κέντρο Αριστείας Ανοιχτού Λογισμικού ΑΠΘ 1ο Θερινό Σχολείο Κώδικα

Οδηγίες για προσθήκη Web Frames Tools to the Quick Access Bar σε μεταγενέστερη έκδοση του Word

Εγχειρίδιο χρήσης συστήματος ηλεκτρονικής αλληλογραφίας της Ελληνικής Ομοσπονδίας Μπριτζ

Atlantis - Νέο user interface

ΥΠΗΡΕΣΙΕΣ ΔΙΑΔΙΚΤΟΥ Explorer & Outlook 2013

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Manual. Εκλογές 15μελούς Σχολείου v4.0 Module καταχώρησης ψηφοδελτίων από την Εφορευτική Επιτροπή

Διαχείριση Βάσης Δεδομένων (dbadmin)

Εργαστήριο 9. Προγραμματιστικές Εφαρμογές στο Διαδίκτυο. Στόχος. Προετοιμασία περιβάλλοντος εργασίας

Συνεργείο Αυτοκινήτων

ΔΕ10: Πληροφοριακά Συστήματα Διοίκησης IΙ Εργαστήριο # 2

ΑΝΑΠΤΥΞΗ ΔΙΑΔΡΑΣΤΙΚΗΣ ΙΣΤΟΣΕΛΙΔΑΣ ΠΑΡΑΓΓΕΛΙΩΝ ΛΙΑΝΙΚΗΣ ΣΕ ΕΡΓΟΣΤΑΣΙΟ

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

Εργαστήριο 8. Προγραμματιστικές Εφαρμογές στο Διαδίκτυο

Δημιουργία και επεξεργασία διανυσματικών επιπέδων στο QGIS

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

1. ΑΝΟΙΞΤΕ ΤΟΝ ΠΙΝΑΚΑ CUSTOMER ΚΑΙ ΣΤΟ ΜΕΝΟΥ ΕΠΙΛΕΞΤΕ

Οδηγός Χρήσης Microsoft Office365 & OneDrive for Business Πανεπιστημίου Κύπρου

ΟΔΗΓΟΣ ΧΡΗΣΗΣ(ΜΑΝUΑL) ΔΙΑΧΕΙΡΙΣΤΗ-ΧΡΗΣΤΗ.

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Όλοι οι χρήστες του Turnitin πρέπει να δημιουργήσουν ένα προφίλ χρήστη.

Java & Java EE 1o Μέρος: Servlets και Java Server Pages. Κακαρόντζας Γεώργιος

Using Google Maps Engine Connector for QGIS

Kεφάλαιο 11 Λίστες και Ανάλυση Δεδομένων Kεφάλαιο 12 Εργαλεία ανάλυσης πιθανοτήτων Kεφάλαιο 13 Ανάλυση δεδομένων...

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Vodafone Business Connect

ΤΑΞΙΝΟΜΗΣΗ ΑΠΟΤΕΛΕΣΜΑΤΩΝ ΕΡΩΤΗΜΑΤΟΣ

Εγχειρίδιο χρήσης Intalio Designer Εγχειρίδιο χρήσης Intalio Designer

Οδηγός γρήγορης εκκίνησης

WORDPRESS. Εικόνα 1. Πατώντας στη «Σύνδεση» γράψτε το Username (όνομα χρήστη) και το Password (συνθηματικό) (εικόνα 2) που σας έδωσε ο διαχειριστής

Εργαστήριο 1-1 η Άσκηση - Ανάλυση

Δημιουργώντας μια εφαρμογή ζωγραφικής. 2 ο Μάθημα

Σχεδόν όλες οι ιστοσελίδες βασίζονται σε μεγάλο βαθμό σε πίνακες. Για να εισάγουμε έναν πίνακα επιλέγουμε από το μενού Insert->Table.

Εγκατάσταση αρχείων βιβλιοθήκης VHOPE και VHOPE

Unity Editor #04 Κεντρικό Μενού: Edit, Unity Preferences

1.Puzzle. ΕΠΙΜΕΛΕΙΑ: ΓΕΩΡΓΙΑ ΚΛΩΣΤΡΑΚΗ Σελίδα 1

2.1 Αντικειµενοστρεφής προγραµµατισµός

MANUAL PRESTASHOP 1.6

Οδηγός Χρήσης Microsoft Office365 & OneDrive for Business Πανεπιστημίου Κύπρου

Management Classes Create Class Create Class Management Classes List of Classes

Ο Οδηγός γρήγορης εκκίνησης

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ

4.1 Άνοιγμα υπάρχοντος βιβλίου εργασίας

ΚΕΦΑΛΑΙΟ Web Services

Epsilon Net PYLON Platform

ΟΔΗΓΙΕΣ ΧΡΗΣΗΣ LIVETRIP TRAVELLER

TEC410 Ανάπτυξη Δικτυακών Τόπων (Δ εξάμηνο)

Ηλεκτρολογικό Σχέδιο στο AutoCAD

Περιγραφή του EcoTruck

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ

Management School School Profile Save

Οδηγίες Χρήσης EAP Controller Software

Με την ολοκλήρωση της διαδικασίας μπορούμε αν θέλουμε να επιλέξουμε να ανοίξει ή όχι η εφαρμογή που έχει εγκατασταθεί.

Από τον κατάλογο Web επιλέγουμε το Page, οπότε στο κυρίως μέρος της οθόνης εμφανίζονται οι σελίδες τις οποίες έχουμε δικαίωμα να ενημερώσουμε.

METALIB Σύστημα μετα-αναζήτησης για ηλεκτρονικές πηγές πληροφόρησης

Διαχείριση Επιλογών Διαμόρφωσης

Transcript:

ΑΝΩΤΑΤΟ ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΙΔΡΥΜΑ ΛΑΡΙΣΑΣ ΤΜΗΜΑ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Ανάπτυξη web εφαρμογής για τη διαχείριση πελατολόγιου ασφαλιστικών συμβούλων ΠΟΛΙΤΗΣ ΠΕΤΡΟΣ Τ-1675 ΕΠΙΒΛΕΠΩΝ : ΣΑΒΒΑΣ ΗΛΙΑΣ

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΚΕΦ.2 ΕΙΣΑΓΩΓΗ ΣΤO MVC.NET Τι είναι το MVC.NET 3 Εργαλεία ανάπτυξης 4 Ένα πρώτο παράδειγμα...4 Razor view Engine..9 _Layout...4 Entity Framework...12 Προσθέτοντας ένα Model...12 CRUD.13 Code First Migrations.. 14 Sort, Search, Paging με χρήση LINQ to Entities. 15 Database Context. 18 Attributes..... 22 Κληρονομικότητα 27 ΚΕΦ.3 ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΑΤΦΟΡΜΑ Android Android Studio 30 Ξεκινώντας με μια απλή εφαρμογή για Android..31 Πλοήγηση..37 ΚΕΦ.4 ΔΙΑΔΙΚΑΣΙΑ ΔΗΜΙΟΥΡΓΙΑΣ ΤΗΣ ΕΦΑΡΜΟΓΗΣ Δημιουργία της Εφαρμογής mvc..39 Android Εφαρμογή 123 ΚΕΦ.5 ΕΠΙΛΟΓΟΣ ΣΥΜΠΕΡΑΣΜΑΤΑ

ΚΕΦ.1 ΣΚΟΠΟΣ ΚΑΙ ΣΤΟΧΟΙ Σκοπός της κατωτέρω πτυχιακής είναι η δημιουργία ιστοσελίδας για την ανάπτυξη web εφαρμογής για τη διαχείριση πελατολόγιου ασφαλιστικών συμβούλων. Η ιστοσελίδα αυτή θα δημιουργηθεί με την βοήθεια των τεχνολογιών MVC.NET και Entity Framework. Επίσης η δημιουργία μιας απλής android εφαρμογής με τη χρήση του Android Studio. Στόχος της εργασίας εκτός από την δημιουργία της προαναφερθείσας εφαρμογής είναι και η γνωριμία και εξοικείωση με τις τεχνολογίες MVC.NET, Entity Framework και Android Webview. ΚΕΦ.2 ΕΙΣΑΓΩΓΗ ΣΤO MVC.NET Τι είναι το MVC.NET Το MVC.NET είναι ένα από τα τρία ASP.NΕΤ προγραμματιστικά μοντέλα. Είναι ένα framework για τη δημιουργία web εφαρμογών χρησιμοποιώντας το μοντέλο MVC (Model View Controller). Συνοπτικά : - Το Model αντιπροσωπεύει τον πυρήνα της εφαρμογής (για παράδειγμα μια λίστα με εγγραφές βάσης δεδομένων). - Το View δείχνει τα δεδομένα (τις εγγραφές της βάσης) - Τo Controller διαχειρίζεται την εισαγωγή (στη βάση δεδομένων). Υπάρχουν 3 επίπεδα λογικής που ορίζουν το MVC. To επίπεδο business (Model logic) Το επίπεδο display (View logic) Το επίπεδο control (Controller logic) Το Model είναι μέρος της εφαρμογής που διαχειρίζεται τη λογική για τα δεδομένα. Συχνά τα αντικείμενα μοντέλων ανακτούν και αποθηκεύουν δεδομένα από τη βάση Το View είναι το μέρος της εφαρμογής που διαχειρίζεται την προβολή των δεδομένων. Συχνά, τα views δημιουργούνται από τα δεδομένα των models. Το Controller είναι το μέρος της εφαρμογής που διαχειρίζεται την αλληλεπίδραση με το χρήστη. Τυπικά οι controllers διαβάζουν δεδομένα από ένα view, διαχειρίζονται την εισαγωγή του χρήστη και στέλνουν τα δεδομένα στο model. Ο διαχωρισμός MVC βοηθά στη διαχείριση σύνθετων εφαρμογών, καθώς μπορεί κάποιος να εστιάσει σε μια ιδιότητα κάθε φορά. Για παράδειγμα, μπορεί κάποιος να εστιάσει στο view, χωρίς να εξαρτάται από τη business λογική. Αυτό καθιστά πιο

εύκολες τις δοκιμές της εφαρμογής. Ο διαχωρισμός MVC επίσης απλοποιεί την ομαδική εργασία. Πολλοί προγραμματιστές μπορούν να δουλέψουν στη views, models και controllers παράλληλα. Εργαλεία ανάπτυξης Τα περιβάλλοντα ανάπτυξης που χρησιμοποιούνται συνήθως είναι το Visual Studio και το δωρεάν εργαλείο Visual Web Developer. Για την κατασκευή των εφαρμογών παρέχονται από τη Microsoft πολλά εργαλεία, είτε για το περιβάλλον επικοινωνίας με το χρήστη είτε για άλλες λειτουργίες όπως η πρόσβαση στη βάση δεδομένων. Ένα από τα μεγάλα πλεονεκτήματα της συγκεκριμένης πλατφόρμας είναι ότι υπάρχουν διαθέσιμα στην αγορά και πάρα εργαλεία (extensions) που μπορούμε να χρησιμοποιήσουμε, τροποποιώντας τα κατά τέτοιο τρόπο ώστε να εξυπηρετούν τις ανάγκες μας. Παράδειγμα είναι το bootstrap, ένα front-end framework, μια συλλογή εργαλείων για τη δημιουργία ιστοσελίδων που περιλαμβάνουν πρότυπα σχεδιασμού, κουμπιά, φόρμες, πλοήγηση κά. Επίσης το mvc mailer το οποίο στέλνει emails χρησιμοποιώντας το view του MVC. Τα περισσότερα εργαλεία γίνονται εγκατάσταση με την πλατφόρμα Nu-Get, η οποία από την έκδοση Visual Studio 2012 είναι προεγκατεστημένη. Ένα πρώτο παράδειγμα Θα δημιουργήσουμε μια απλή εφαρμογή «Hello World!» χρησιμοποιώντας το Visual Studio 2013 και σαν γλώσσα προγραμματισμού τη C#. Ανοίγουμε το Visual Studio και από το File Menu επιλέγουμε New-> Project. Στο παράθυρο που εμφανίζεται διαλέγουμε από το αριστερό μενού Web και δεξιά ASP.NET Web Application

Μετά διαλέγουμε το MVC template To Visual Studio θα ξεκινήσει τη διαδικασία της δημιουργίας του σκελετού της εφαρμογής. Θα δημιουργήσει τους βασικούς φακέλους Models Views Controllers καθώς και μερικούς βοηθητικούς φακέλους όπως Content, Scripts, fonts κλπ. Όλα μαζί, και ο τρόπος με τον οποίο αλληλεπιδρούν μεταξύ τους δημιουργούν ένα βασικό web site. Ανοίγοντας το φάκελο Controllers μέσα από το Visual Studio, βλέπουμε ότι υπάρχει ήδη ένα αρχείο HomeController.cs. Είναι ένα από τα βασικά αρχεία που δημιουργεί το Visual Studio, μαζί με τα Views. Ανοίγοντας το φάκελο Views βλέπουμε 2 υποφάκελους, το Shared και το Home. Παρατηρεί κανείς την κοινή λέξη Home στο φάκελο Controllers και στο φάκελο Views. Είναι η αντιστοίχηση του View με τον Controller και όπως θα δούμε αργότερα, συνήθως κάθε Controller έχει το δικό του View. Για την ώρα, θέλουμε να εμφανίσουμε το μήνυμα Hello World. Ανοίγοντας το αρχείο Index.cshtml μέσα στο φάκελο Home γράφουμε το κείμενο Hello World! και αυτό θα εμφανιστεί στην οθόνη μας. <div>hello, world!

Έχει προηγηθεί πρώτα όμως μια αλυσίδα αλληλεπιδράσεων που θα εξηγήσουμε αμέσως. Αρχικά ο Controller περιέχει τον εξής κώδικα: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace WebApplication3.Controllers public class HomeController : Controller public ActionResult Index() return View(); Αναλύοντας τον κώδικα, αρχικά βλέπουμε μια λίστα με.net namespaces τα οποία περιλαμβάνουμε στην εφαρμογή μας χρησιμοποιώντας τη λέξη-κλειδί «using». Στη συνέχεια έχουμε τη δήλωση του namespace, κι εφόσον η εφαρμογή μας είναι η Helloworld, το namespace μας θα είναι namespace Helloworld.Controllers το οποίο εξυπηρετεί τη λογική δρομολόγησης της.net. Το όνομα της τάξης μας είναι "HomeController", και η άνω-κάτω τελεία μας λέει ότι κληρονομεί από την τάξη Controller. Αυτό είναι πολύ σημαντικό: σημαίνει ότι η τάξη μας μπορεί να κάνει πολλά πράγματα χωρίς να χρειάζεται να γράψουμε κώδικα, επειδή ακριβώς κληρονομεί τις ιδιότητες και τις μεθόδους της από μια άλλη τάξη. Η μέθοδος που καλούμε είναι η Index, είναι τύπου ActionResult που σημαίνει ότι αναπαριστά το αποτέλεσμα μιας ενέργειας. Η ενέργεια στην προκειμένη περίπτωση είναι να επιστρέψει το View του Index. Ανατρέχοντας στο φάκελο Views, θα δούμε το αρχείο Index, στο οποίο γράψαμε το μήνυμά μας Hello World!.

Για να γίνει λίγο πιο κατανοητός ο κώδικάς μας, θα εμφανίσουμε προγραμματιστικά το μήνυμα Hello World!. Θα αλλάξουμε την Index ως εξής: public ActionResult Index() ViewBag.Message = "Hello, world!"; return View(); και θα σβήσουμε το περιεχόμενο του Index.Cshtml και θα προσθέσουμε την εντολή @ViewBag.Message,την οποία και καλέσαμε στον controller. Κοιτάζοντας το αποτέλεσμα στον browser μας θα δούμε Το αποτέλεσμα είναι ακριβώς το ίδιο, αλλά, χρησιμοποιήσαμε την τεχνική του CodeBehind. Ας προσθέσουμε την ίδια μέθοδο με διαφορετική ονομασία. Έστω public ActionResult Hello() ViewBag.Message = "Hello, world!"; return View(); Κάνοντας δεξί κλικ πάνω στη μέθοδο θα δούμε την επιλογή Add View. Τα views μπορούμε να τα προσθέτουμε χειροκίνητα, όμως το Visual Studio μας δίνει την επιλογή να προσθέτει αυτόματα views, κάτι που όπως θα δούμε στην πορεία είναι ένα σημαντικό εργαλείο σε πιο περίπλοκες εφαρμογές.

Στο παράθυρο διαλόγου που ανοίγει έχουμε ορισμένες επιλογές Θα ονομάσουμε Hello το view, δε θα χρησιμοποιήσουμε κάποιο μοντέλο και θα χρησιμοποιήσουμε τη layout page, την οποία θα εξηγήσουμε στη συνέχεια. Στο φάκελο Views/Home δημιουργήθηκε ένα αρχείο Hello.cshtml με τον εξής κώδικα:

@ ViewBag.Title = "Hello"; <h2>hello</h2> Θα αλλάξουμε το περιεχόμενο <h2>hello</h2> με το @ViewBag.Message. Όπως θα δούμε, στον browser πλέον το path διαμορφώθηκε ως http://localhost:27551/home/hello. Ενώ το index είναι η αρχική μας σελίδα και φορτώνει αυτόματα ως προεπιλογή, προσθέτοντας ένα νέο view για να το δούμε θα πρέπει να ορίσουμε το path που βρίσκεται. Razor view Engine Πριν συνεχίσουμε, ας αναφερθούμε στη Razor view engine. Είναι μια προγραμματιστική σύνταξη της Asp.Net που χρησιμοποιείται για τη δημιουργία δυναμικών ιστοσελίδων με τη γλώσσα προγραμματισμού C#. Στην ουσία αντικαθιστά την ASPX σύνταξη όπου χρειαζόταν ο κώδικας να γραφτεί ανάμεσα στα σύμβολα <%= [ ] %>. Η ιδέα είναι να παρέχει μια βελτιστοποιημένη σύνταξη για την παραγωγή html κειμένου με όσο το δυνατόν μικρότερη μετάβαση μεταξύ html και κώδικα. Ας δούμε ένα μικρό παράδειγμα, προσθέτοντας τον παρακάτω κώδικα στο νέο view που δημιουργήσαμε. Θα πούμε <ul> @for (int i = 0; i < 10; i++) <li>@i</li> </ul> Μια συνηθισμένη for δομή επανάληψης, όπου θα εμφανίζει τους αριθμούς 1-10 σε μορφή unordered list.

Παρατηρούμε επίσης πως στην καρτέλα πάνω αριστερά γράφει: Hello My ASP.NET Application. Αυτό το δηλώνουμε με την εντολή @ ViewBag.Title = "Hello"; Όπου και έχουμε ορίσει ως ViewBag.Title το Hello. Που βρίσκεται όμως υπόλοιπο κείμενο; _Layout Το Layout αντικαθιστά το master page όπως το γνωρίζαμε στην asp.net. Είναι ο σκελετός της σελίδας και τα αντικείμενα που περιλαμβάνει τα κληρονομούν όλα τα view εκτός κι αν οριστεί διαφορετικά. Το layout μας είναι ως εξής: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>@viewbag.title - My ASP.NET Application</title> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") </head> <body> @RenderBody() @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false) </body> </html> Βλέπουμε την κλασσική html δομή με κάποιες προσθήκες. Αυτές είναι οι εξής: @Styles.Render("~/Content/css") Αντί να γράφουμε ξεχωριστή γραμμή για κάθε css αρχείο που θέλουμε να προσθέσουμε, τα γράφουμε όλα στο ξεχωριστό αρχείο BundleConfig.cs και καλούμε στην html την εντολή που θέλουμε κάθε φορά. Το BundleConfig είναι μια ομάδα αρχείων που μπορεί να φορτωθεί με ένα απλό request στην html. Μπορούμε να δημιουργήσουμε διάφορες ομάδες αρχείων css ή javascripts δημιουργώντας διαφορετικές τάξεις μέσα στο BundleConfig. Για παράδειγμα το Content/css που καλούμε στο BundleConfig περιγράφεται ως εξής: bundles.add(new StyleBundle("~/Content/css").Include( "~/Content/bootstrap.css", "~/Content/site.css"));

Όπως βλέπουμε περιλαμβάνει τα αρχεία bootstrap.css και site.css που βρίσκονται στο φάκελο Content. O τίτλος μας είναι ο <title>@viewbag.title </title> που όπως είδαμε προηγουμένως είναι μέρος του τίτλου της καρτέλας μας. Άρα το πλήρες όνομα είναι αυτό που δηλώνουμε ως Viewbag.Title και το κείμενο - My ASP.NET Application. Θα το σβήσουμε, κρατώντας μόνο το viewbag. Τέλος, το σημαντικότερο, είναι το @RenderBody(). Η εντολή αυτή καλεί κάθε view που έχουμε και το τοποθετεί σε εκείνο το μέρος της σελίδας. Στην ουσία όταν καλούμε το view Home/Index.cshtml ο browser διαβάζει: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>@viewbag.title</title> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") </head> <body> @ViewBag.Message @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false) </body> </html> Και όταν καλούμε το view Home/Hello.cshtml ο browser διαβάζει: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>@viewbag.title</title> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") </head> <body> @ ViewBag.Title = "Hello"; @ViewBag.Message <ul> @for (int i = 0; i < 10; i++)

</ul> <li>@i</li> @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @RenderSection("scripts", required: false) </body> </html> που είχαμε γράψει προηγουμένως. Ας φτιάξουμε τώρα από την αρχή ένα Model - View - Controller. Πριν όμως δουλέψουμε με τη database, θα κάνουμε εγκατάσταση το Entity Framework 6. Entity Framework Το Entity Framework (EF) είναι ένα framework ανοιχτού κώδικα που ανήκει στην «οικογένεια».net και υποστηρίζει την ανάπτυξη εφαρμογών αντικειμενοστραφούς κώδικα, όπως η C#. Επιτρέπει στους προγραμματιστές να εργάζονται με τα δεδομένα σε μορφή κώδικα, όπως είναι ο πελάτης και η διεύθυνση ενός πελάτη, χωρίς να χρειάζεται να ασχοληθούν με πίνακες και δεδομένα όπως είναι αποθηκευμένα στις βάσεις. Στο Package Manager γράφουμε την εντολή Install-Package EntityFramework και είμαστε έτοιμοι να εκμεταλλευτούμε τις δυνατότητες του Entity Framework. Προσθέτοντας ένα Model Στο κυρίως project στο φάκελο Models κάνουμε δεξί κλικ Add->Class και επιλέγουμε Class στο παράθυρο διαλόγου που εμφανίζεται. Ονομάζουμε την κλάση Student και προσθέτουμε τα χαρακτηριστικά ID, FirstMidName, LastName για αρχή. Ο κώδικάς μας θα διαμορφωθεί ως εξής: using System.Data.Entity; namespace Helloworld.Models public class Student public int ID get; set; public string FirstMidName get; set; public string LastName get; set; Προσθέτουμε τις εντολές public class StudentContext : DbContext public DbSet<Student> Students get; set;

Η κλάση StudentContext αντιστοιχεί στο context της βάσης δεδομένων Helloworld. Αυτό είναι χρήσιμο για την ανάκτηση, αποθήκευση και ανανέωση της κλάσης Student στη βάση δεδομένων. Αργότερα, θα ασχοληθούμε παραπάνω με το database context. Για τη βάση δεδομένων θα χρειαστούμε και ένα connection string που να συνδέει την εφαρμογή μας με τη βάση δεδομένων. Ανοίγουμε το αρχείο Web.Config που βρίσκεται στον αρχικό μας φάκελο (και όχι το web.config που βρίσκεται στο φάκελο Views) και προσθέτουμε τον εξής κώδικα: <add name="studentcontext" connectionstring="data Source=stp-pc\sqlexpress;Initial Catalog=Student;AttachDbFileName= DataDirectory \Student.mdf;Integrated Security=SSPI;" providername="system.data.sqlclient" /> Σ αυτό το σημείο θα κάνουμε ένα build την εφαρμογή μας να βεβαιωθούμε πως όλα δουλεύουν κανονικά. CRUD Συντομογραφία για το Create Read Update Delete, το Visual Studio έχει τη δυνατότητα να φτιάξει βασικά views που να εξυπηρετούν αυτές τις λειτουργίες, προσδιορίζοντας το model για το οποίο θέλουμε να δημιουργήσουμε τα views. Στο φάκελο Controllers διαλέγουμε Add->Controller και στο παράθυρο διαλόγου διαλέγουμε MVC 5 Controller with views, using Entity Framework. Στο επόμενο παράθυρο διαλέγουμε το Student (Helloworld.Models) και Data context class StudentContext (Helloworld.Models). Τέλος, ονομάζουμε τον controller StudentController. Ξεκινά η διαδικασία Scaffolding η οποία όταν ολοκληρωθεί έχει φτιάξει εκτός από τον controller και το φάκελο Student με τα views Create, Delete, Details, Edit και Index. Τρέχοντας την εφαρμογή μας βλέπουμε τη σελίδα Create:

Πατώντας πάνω στο Create New θα μας πάει στη σελίδα Student/Create όπου και μπορούμε να συμπληρώσουμε τα πεδία FirstName και LastName όπως τα είχαμε δηλώσει στην κλάση Student. Μόλις πατήσουμε Create δημιουργήσαμε την πρώτη εισαγωγή στον πίνακα Student Και όλα αυτά χωρίς να χρειαστεί να δημιουργήσουμε χειροκίνητα τα views! Code First Migrations Όταν αναπτύσσουμε μια καινούρια εφαρμογή, το model τροποποιείται συχνά, με αποτέλεσμα να αποσυντονίζεται με τη βάση. Το Entity Framework έχει τη δυνατότητα κάθε φορά που αλλάζει το model να διαγράφει και να ξαναδημιουργεί τη βάση με τα καινούρια στοιχεία. Η μέθοδος αυτή όμως δε βοηθά όταν η εφαρμογή έχει μεγάλο όγκο δεδομένων. Όταν βγει στην παραγωγή μια τέτοια εφαρμογή, όποιες αλλαγές γίνουν δε θα πρέπει να επηρεάζουν τη βάση μας. Η μέθοδος Code First Migration λύνει αυτό το πρόβλημα με το να επιτρέπει την ανανέωση της βάσης αντί να τη διαγράφει και να την ξαναδημιουργεί. Στη γραμμή εντολών θα εισάγουμε enable-migrations και στη συνέχεια θα δούμε το μήνυμα Code First Migrations enabled for project Helloworld Στη συνέχεια θα δούμε πως δημιουργήθηκε ο φάκελος Migrations και μέσα εκεί το αρχείο InitialCreate.cs και Configuration.cs. Το αρχείο Configuration περιλαμβάνει μια μέθοδο seed η οποία εισάγει δεδομένα στη βάση μας. Έτσι λοιπόν για το model Student με στοιχεία ID, FirstName, LastName μπορούμε να προσθέσουμε μερικά δεδομένα ακόμα. Θα προσθέσουμε και μια ακόμα ιδιότητα, την AM η οποία θα είναι ένα string και το EnrollmentDate που θα είναι μια ημερομηνία. Έτσι λοιπόν στο Model θα αλλάξουμε τον κώδικά μας ως εξής public int ID get; set; public string AM get; set; public string FirstName get; set; public string LastName get; set; public string EnrollmentDate get; set; γράφοντας add-migration Key στη γραμμή εντολών προστίθεται ένα αρχείο στο φάκελο Migrations. namespace Helloworld.Migrations using System; using System.Data.Entity.Migrations; public partial class Key : DbMigration public override void Up()

AddColumn("dbo.Student", "key", c => c.int(nullable: false)); public override void Down() DropColumn("dbo.Student", "key"); Τα Migrations αρχεία καλούν τη μέθοδο Up για να εκτελέσει τις αλλαγές. Αν εισάγουμε εντολή για να κάνουμε roll back στην ανανέωση καλεί την μέθοδο Down. Έτσι λοιπόν, μέσα στη μέθοδο up υπάρχει η εντολή που λέει AddColumn("dbo.Student ", "key", c => c.int(nullable: false)) η οποία προσθέτει μια ακόμα στήλη στο table People στη βάση μας. Αν θελήσουμε να κάνουμε rollback, στη μέθοδο Down θα εκτελέσει την εντολή DropColumn. Εκτελούμε την εντολή update-database η οποία εφαρμόζει τις εντολές αυτές στη βάση μας. Sort, Search, Paging με χρήση LINQ to Entities Η βάση μας αυτή τη στιγμή περιλαμβάνει περίπου 60 εισαγωγές. Για να γίνει πιο λειτουργική η σελίδα μας θα προσθέσουμε τρεις λειτουργίες στο StudentController. Δυνατότητα αναζήτησης, ταξινόμησης και σελιδοποίηση των αποτελεσμάτων. Θα εγκαταστήσουμε το PagedList.Mvc γράφοντας στη γραμμή εντολών Install-Package PagedList.Mvc Και θα αλλάξουμε τη μέθοδο Index του StudentController ως εξής: public ViewResult Index(string sortorder, string currentfilter, string searchstring, int? page) ViewBag.CurrentSort = sortorder; ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder)?"name_desc" : ""; ViewBag.KeySortParm = sortorder == "Key"? "key_desc" : "Key"; if (searchstring!= null) page = 1; else searchstring = currentfilter; ViewBag.CurrentFilter = searchstring; var students = from s in db.students select s; if (!String.IsNullOrEmpty(searchString)) students = students.where(s => s.lastname.contains(searchstring) s.firstname.contains(searchstring)); switch (sortorder)

case "name_desc": students = students.orderbydescending(s => s.lastname); break; case "Key": students = students.orderby(s => s.am); break; case "key_desc": students = students.orderbydescending(s => s.am); break; default: // Name ascending students = students.orderby(s => s.lastname); break; int pagesize = 10; int pagenumber = (page?? 1); return View(students.ToPagedList(pageNumber, pagesize)); Αρχικά στον κώδικά μας προσθέτουμε τρεις παραμέτρους: τρέχον φίλτρο (currentfilter), τρέχουσα ταξινόμηση (sortorder) και αριθμός σελίδας (page). Την πρώτη φορά που θα φορτώσει η σελίδα ο χρήστης δεν έχει επιλέξει κάποια ταξινόμηση ή κάποια σελίδα, οπότε όλες οι τιμές είναι null. Αν επιλεχτεί κάποια σελίδα, η μεταβλητή page θα πάρει τιμή, οπότε και θα ανατρέξει στη σελίδα που επέλεξε ο χρήστης. Η ιδιότητα Viewbag μας επιτρέπει να μη χαθεί η επιλογή της ταξινόμησης (είτε με το επίθετο είτε με το key), ενώ διαλέγουμε τη σελίδα που θέλουμε. Το CurrentFilter μας δίνει τη δυνατότητα της αναζήτησης. Εισάγοντας ένα string, αλλάζει η τιμή searchstring από null σε currentfilter και βρίσκει τα ονόματα εκείνα που περιέχουν την τιμή searchstring. Στο τέλος του index προσθέσαμε τη μέθοδο ToPagedList, με την οποία ορίζουμε το μέγεθος των αποτελεσμάτων σε κάθε σελίδα (pagesize) και την σελίδα στην οποία βρισκόμαστε (pagenumber) ή να επιστρέψει τη σελίδα 1 αν δεν έχει επιλεχθεί από το χρήστη κάποια σελίδα (page?? 1 ). Η μέθοδος χρησιμοποιεί LINQ to Entities για να προσδιορίσει τη στήλη που θα ταξινομήσει. Ο κώδικας δημιουργεί μια IQueryable μεταβλητή πριν τη switch, τη διαμορφώνει μέσα στη switch και καλεί τη μέθοδο ToList μετά το τέλος της switch. Όταν δημιουργείται μια IQueryable μεταβλητή, κανένα query δεν στέλνεται στη βάση. Το query δεν εκτελείται μέχρι να καλέσουμε κάποια μέθοδο όπως το ToList όπου και θα μετατρέψει το IQueryable σε συλλογές. Ως εκ τούτου ο κώδικας καταλήγει σε ένα query που δεν εκτελείται μέχρι το return View(); Γενικά, στο query προσδιορίζουμε ακριβώς την πληροφορία που θέλουμε από τη βάση. Επίσης προσδιορίζουμε πως θα ταξινομηθεί, ομαδοποιηθεί και διαμορφωθεί πριν επιστρέψει μια τιμή. Αντίθετα στη LINQ το query αποθηκεύεται σε μια μεταβλητή. Αν το query επιστρέψει μια ακολουθία τιμών, τότε το query από μόνο του σίγουρα είναι queryable τύπου. Η ίδια η μεταβλητή δεν εκτελεί καμιά ενέργεια και δεν αποθηκεύει δεδομένα, παρά μόνο αποθηκεύει την πληροφορία του query. Έτσι λοιπόν μόλις δημιουργηθεί πρέπει εκτελεστεί για να ανακτηθούν δεδομένα.

Προσαρμόζουμε το view έτσι ώστε να χρησιμοποιεί το PagedList, προσθέτουμε ένα textbox αναζήτησης, δυο link που θα μας επιτρέπουν την ταξινόμηση κατά όνομα ή key και τέλος έναν σελιδοδείκτη στο τέλος της σελίδας μας. @model PagedList.IPagedList<Helloworld.Models.Student> @using PagedList.Mvc; <link href="~/content/pagedlist.css" rel="stylesheet" type="text/css" /> @ ViewBag.Title = "Index"; <h2>index</h2> <p> @Html.ActionLink("Create New", "Create") </p> @using (Html.BeginForm("Index", "Student", FormMethod.Get)) <p> Εύρεση Ονόματος: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string) <input type="submit" value="search" /> </p> <table class="table"> <tr> <th> @Html.ActionLink("Last Name", "Index", new sortorder = ViewBag.NameSortParm, currentfilter = ViewBag.CurrentFilter ) </th> <th> First Name </th> <th> @Html.ActionLink("Key", "Index", new sortorder = ViewBag.KeySortParm, currentfilter = ViewBag.CurrentFilter ) </th> <th></th> </tr> @foreach (var item in Model) <tr> <td> @Html.DisplayFor(modelItem => item.lastname) </td> <td> @Html.DisplayFor(modelItem => item.firstname) </td> <td> @Html.DisplayFor(modelItem => item.key) </td> <td> @Html.ActionLink("Edit", "Edit", new id = item.id ) @Html.ActionLink("Details", "Details", new id = item.id ) @Html.ActionLink("Delete", "Delete", new id = item.id ) </td> </tr>

</table> <br> Page @(Model.PageCount < Model.PageNumber? 0 : Model.PageNumber) of @Model.PageCount @Html.PagedListPager(Model, page => Url.Action("Index", new page, sortorder = ViewBag.CurrentSort, currentfilter = ViewBag.CurrentFilter )) Στην πορεία θα δημιουργήσουμε ένα πιο σύνθετο Data Model και θα δείξουμε πως αλληλεπιδρούν τα models μεταξύ τους. Database Context Η βασική κλάση που συντονίζει τη λειτουργία του Entity Framework με τα models είναι το database context. Στον κώδικά μας μπορούμε να προσδιορίσουμε ποια μοντέλα θα συμπεριλαμβάνονται στο data model καθώς και τη συμπεριφορά του Entity Framework. Για αρχή, θα φτιάξουμε έναν βοηθητικό φάκελο και θα τον ονομάσουμε DAL (Data Access Layer) και εκεί τo αρχείο HelloContext. Όπως είδαμε στο model Student δημιουργήσαμε την κλάση public class HelloContext : DbContext καθώς είχαμε μόλις ένα model στην εφαρμογή μας. Τώρα, θα προσθέσουμε μερικά ακόμα οπότε για κάθε model που αντιστοιχεί στη βάση μας πρέπει να καλούμε μια μέδοδο DbSet. Αυτός ο κώδικας δημιουργεί μια ιδιότητα DbSet για κάθε entity set. Στην ορολογία EF, ένα entity set αντιστοιχεί συνήθως σε έναν πίνακα βάσης δεδομένων, καθώς και κάθε entity αντιστοιχεί σε μια σειρά στον πίνακα. Για δική μας διευκόλυνση λοιπόν, θα βάλουμε όλα τα entity set σε ένα αρχείο και θα μετονομάσουμε το Context μας από Student σε κάτι πιο γενικό, όπως το όνομα του projetct μας. Για να γίνει αυτό, θα πρέπει τις αναφορές στο StudentContext να τις μετονομάσουμε σε HelloContext. Ο κώδικας του HelloContext θα διαμορφωθεί ως εξής: using Helloworld.Models; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; namespace Helloworld.DAL public class HelloContext : DbContext public HelloContext() : base("hellocontext") public DbSet<Person> Persons get; set; public DbSet<Student> Students get; set; public DbSet<Professor> Professors get; set; protected override void OnModelCreating(DbModelBuilder modelbuilder) modelbuilder.conventions.remove<pluralizingtablenameconvention>();

Η γραμμή modelbuilder.conventions.remove<pluralizingtablenameconvention>(); στη μέθοδο OnModelCreating αποτρέπει τον πληθυντικό στα ονόματα των tables. Έτσι για παράδειγμα το Students θα γίνει Student. Θα προσθέσουμε ένα ακόμη model, το Professor με πεδία LastName, FirstMidName και HireDate. Η διαδικασία η ίδια, θα φτιάξουμε το model, θα προσθέσουμε controller βασισμένο στο model και τα views θα δημιουργηθούν αυτόματα. Τώρα, στο αρχείο Configuration θα προσθέσουμε mock data για να αρχίσει να δουλεύει η εφαρμογή μας. namespace Helloworld.Migrations using Helloworld.Models; using System; using System.Collections.Generic; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; internal sealed class Configuration : DbMigrationsConfiguration<Helloworld.DAL.HelloContext> public Configuration() AutomaticMigrationsEnabled = false; protected override void Seed(Helloworld.DAL.HelloContext context) var students = new List<Student> new Student am="1038", LastName="ΤΖΙΑΚΟΥ", FirstMidName="ΔΕΣΠΟΙΝΑ", EnrollmentDate = DateTime.Parse("2010-09-01"), new Student am="1039", LastName="ΤΖΙΑΛΛΑ", FirstMidName="ΠΑΡΑΣΚΕΥΗ", EnrollmentDate = DateTime.Parse("2010-09-01"), new Student am="1122", LastName="ΣΒΙΓΚΟΥ", FirstMidName="ΚΩΝΣΤΑΝΤΙΝΑ", EnrollmentDate = DateTime.Parse("2010-09-01"), new Student am="1298", LastName="ΨΥΧΟΓΥΙΟΥ", FirstMidName="ΕΛΕΝΗ", EnrollmentDate = DateTime.Parse("2010-09-01"), new Student am="1332", LastName="ΨΙΜΑΡΝΗΣ", FirstMidName="ΕΛΕΥΘΕΡΙΟΣ", EnrollmentDate = DateTime.Parse("2010-09-01"), new Student am="1457", LastName="ΨΥΡΡΟΠΟΥΛΟΣ", FirstMidName="ΕΥΣΤΑΘΙΟΣ", EnrollmentDate = DateTime.Parse("2010-09-01"), new Student am="1666", LastName="ΨΥΡΡΑ", FirstMidName="ΒΑΣΙΛΙΚΗ", EnrollmentDate = DateTime.Parse("2010-09-01"), new Student am="1708", LastName="ΣΑΧΠΕΛΙΔΟΥ", FirstMidName="ΒΗΘΛΕΕΜ", EnrollmentDate = DateTime.Parse("2012-09-01"), new Student am="1713", LastName="ΣΕΒΑΣΤΙΔΟΥ", FirstMidName="ΑΓΓΕΛΙΚΗ", EnrollmentDate = DateTime.Parse("2012-09-01"), new Student am="1738", LastName="ΧΑΡΙΣΙΑΔΗΣ", FirstMidName="ΠΑΝΑΓΙΩΤΗΣ", EnrollmentDate = DateTime.Parse("2012-09-01"), new Student am="1895", LastName="ΣΒΕΝΤΖΟΥΡΗ", FirstMidName="ΑΓΑΠΗ", EnrollmentDate = DateTime.Parse("2012-09-01"), new Student am="2100", LastName="ΝΕΓΡΗΣ", FirstMidName="ΛΑΖΑΡΟΣ", EnrollmentDate = DateTime.Parse("2012-09-01"),

new Student am="2273", LastName="ΨΑΡΟΥΔΑΚΗΣ", FirstMidName="ΑΛΕΞΑΝΔΡΟΣ", EnrollmentDate = DateTime.Parse("2012-09-01"), new Student am="2566", LastName="ΣΒΙΓΚΟΥ", FirstMidName="ΑΙΚΑΤΕΡΙΝΗ", EnrollmentDate = DateTime.Parse("2012-09-01"), new Student am="2976", LastName="ΨΥΡΟΥΚΗ", FirstMidName="ΜΑΡΙΑ ΙΩΑΝΝΑ", EnrollmentDate = DateTime.Parse("2012-09-01"), new Student am="3152", LastName="ΤΖΙΑΚΑ", FirstMidName="ΜΑΡΙΑ", EnrollmentDate = DateTime.Parse("2012-09-01"), new Student am="3249", LastName="ΧΑΡΙΣΗΣ", FirstMidName="ΒΑΣΙΛΕΙΟΣ", EnrollmentDate = DateTime.Parse("2013-09-01"), new Student am="3392", LastName="ΜΕΡΣΙΑΔΟΥ", FirstMidName="ΘΕΟΦΑΝΩ", EnrollmentDate = DateTime.Parse("2013-09-01"), new Student am="3656", LastName="ΤΖΙΚΟΥ", FirstMidName="ΙΩΑΝΝΑ", EnrollmentDate = DateTime.Parse("2013-09-01"), new Student am="3734", LastName="ΨΙΜΟΥΛΗΣ", FirstMidName="ΣΤΑΥΡΟΣ", EnrollmentDate = DateTime.Parse("2013-09-01"), new Student am="3861", LastName="ΜΕΡΜΙΓΓΗ", FirstMidName="ΕΥΑΓΓΕΛΙΑ", EnrollmentDate = DateTime.Parse("2013-09-01"), new Student am="3884", LastName="ΣΒΙΓΚΟΣ", FirstMidName="ΝΙΚΟΛΑΟΣ", EnrollmentDate = DateTime.Parse("2013-09-01"), new Student am="3999", LastName="ΞΕΝΑΚΗΣ", FirstMidName="ΕΜΜΑΝΟΥΗΛ", EnrollmentDate = DateTime.Parse("2013-09-01"), new Student am="4073", LastName="ΨΥΧΟΥΝΤΑΚΗ", FirstMidName="ΑΛΕΞΑΝΔΡΑ", EnrollmentDate = DateTime.Parse("2013-09-01"), new Student am="4220", LastName="ΝΕΓΡΕΠΟΝΤΗ", FirstMidName="ΑΡΓΥΡΗ", EnrollmentDate = DateTime.Parse("2013-09-01"), new Student am="4313", LastName="ΞΕΝΑΚΗΣ", FirstMidName="ΕΜΜΑΝΟΥΗΛ", EnrollmentDate = DateTime.Parse("2013-09-01"), new Student am="4373", LastName="ΨΩΜΑ", FirstMidName="ΔΗΜΗΤΡΑ", EnrollmentDate = DateTime.Parse("2014-09-01"), new Student am="4611", LastName="ΤΖΙΑΦΤΑΝΗ", FirstMidName="ΜΑΝΩΛΙΝΑ", EnrollmentDate = DateTime.Parse("2014-09-01"), new Student am="4626", LastName="ΨΙΜΟΥΛΑΚΗ", FirstMidName="ΜΑΡΙΑ", EnrollmentDate = DateTime.Parse("2014-09-01"), new Student am="4946", LastName="ΤΖΙΝΤΖΙΟΒΑΣ", FirstMidName="ΚΩΝΣΤΑΝΤΙΝΟΣ", EnrollmentDate = DateTime.Parse("2014-09-01"), new Student am="5167", LastName="ΨΑΡΙΩΤΗ", FirstMidName="ΕΛΕΝΗ-ΛΙΝΤΑ", EnrollmentDate = DateTime.Parse("2014-09-01"), new Student am="5356", LastName="ΤΖΙΛΑΚΟΥ", FirstMidName="ΕΛΕΝΗ", EnrollmentDate = DateTime.Parse("2014-09-01"), new Student am="5519", LastName="ΣΔΡΟΥΛΙΑ", FirstMidName="ΠΑΝΑΓΙΩΤΑ", EnrollmentDate = DateTime.Parse("2014-09-01"), new Student am="5650", LastName="ΣΒΙΓΓΟΣ", FirstMidName="ΙΩΑΝΝΗΣ", EnrollmentDate = DateTime.Parse("2014-09-01"), new Student am="5816", LastName="ΨΩΜΑΣ", FirstMidName="ΝΙΚΟΛΑΟΣ", EnrollmentDate = DateTime.Parse("2014-09-01"), new Student am="5817", LastName="ΩΡΟΛΟΓΑ", FirstMidName="ΜΑΡΙΑ", EnrollmentDate = DateTime.Parse("2014-09-01"), new Student am="6015", LastName="ΨΥΧΟΓΥΙΟΥ", FirstMidName="ΖΩΗ", EnrollmentDate = DateTime.Parse("2014-09-01"), new Student am="6176", LastName="ΧΑΡΙΚΛΕΟΥΣ", FirstMidName="ΔΗΜΗΤΡΑ", EnrollmentDate = DateTime.Parse("2014-09-01"), new Student am="6322", LastName="ΜΕΣΟΛΩΡΑ", FirstMidName="ΦΑΝΗ", EnrollmentDate = DateTime.Parse("2014-09-01"), new Student am="6326", LastName="ΧΑΡΙΣΗΣ", FirstMidName="ΑΠΟΣΤΟΛΟΣ", EnrollmentDate = DateTime.Parse("2014-09-01"), ;

s)); students.foreach(s => context.students.addorupdate(p => p.lastname, context.savechanges(); var professors = new List<Professor> new Professor LastName="ΨΩΪΝΟΥ", FirstMidName="ΧΑΡΑΛΑΜΠΙΑ", HireDate = DateTime.Parse("2005-09-01"), new Professor LastName="ΨΑΡΡΟΥ", FirstMidName="ΑΓΓΕΛΙΚΗ", HireDate = DateTime.Parse("2005-09-01"), new Professor LastName="ΣΓΟΥΡΟΣ", FirstMidName="ΓΕΩΡΓΙΟΣ", HireDate = DateTime.Parse("2005-09-01"), new Professor LastName="ΣΓΟΥΡΟΠΟΥΛΟΣ", FirstMidName="ΠΑΝΑΓΙΩΤΗΣ", HireDate = DateTime.Parse("2005-09-01"), new Professor LastName="ΨΩΜΑΚΑΚΗΣ", FirstMidName="ΙΩΑΝΝΗΣ", HireDate = DateTime.Parse("2004-09-01"), new Professor LastName="ΧΡΥΣΑΝΘΑΚΟΠΟΥΛΟΥ", FirstMidName="ΓΕΩΡΓΙΑ", HireDate = DateTime.Parse("2004-09-01"), new Professor LastName="ΞΕΝΑΚΗ", FirstMidName="ΙΩΑΝΝΑ", HireDate = DateTime.Parse("2004-09-01"), new Professor LastName="ΜΕΡΤΖΑΝΙΔΟΥ", FirstMidName="ΔΕΣΠΟΙΝΑ", HireDate = DateTime.Parse("2004-09-01"), new Professor LastName="ΤΖΙΜΑ", FirstMidName="ΒΑΡΒΑΡΑ", HireDate = DateTime.Parse("2003-09-01"), new Professor LastName="ΨΑΡΟΜΥΑΛΟΥ", FirstMidName="ΣΟΦΙΑ", HireDate = DateTime.Parse("2003-09-01"), new Professor LastName="ΝΕΟΚΛΕΟΥΣ", FirstMidName="ΣΤΑΜΑΤΟΥΛΑ", HireDate = DateTime.Parse("2003-09-01"), new Professor LastName="ΨΥΧΟΓΙΟΥ", FirstMidName="ΑΓΓΕΛΙΚΗ", HireDate = DateTime.Parse("2003-09-01"), new Professor LastName="ΨΥΧΑΡΗ", FirstMidName="ΧΡΙΣΤΙΝΑ", HireDate = DateTime.Parse("2003-09-01"), new Professor LastName="ΤΖΙΑΜΟΥ", FirstMidName="ΕΛΕΝΗ", HireDate = DateTime.Parse("2002-09-01"), new Professor LastName="ΝΕΟΛΙΑΝΛΗ", FirstMidName="ΧΡΙΣΤΙΝΑ", HireDate = DateTime.Parse("2002-09-01"), new Professor LastName="ΨΥΧΟΓΥΙΟΥ", FirstMidName="ΓΕΩΡΓΙΑ", HireDate = DateTime.Parse("2002-09-01"), new Professor LastName="ΤΖΙΜΑΣ", FirstMidName="ΜΑΡΓΑΡΙΤΗΣ", HireDate = DateTime.Parse("2002-09-01"), new Professor LastName="ΠΑΝΑΓΙΩΤΙΔΗΣ", FirstMidName="ΝΙΚΟΛΑΟΣ", HireDate = DateTime.Parse("2001-09-01"), new Professor LastName="ΝΕΔΕΛΚΟΠΟΥΛΟΣ", FirstMidName="ΑΘΑΝΑΣΙΟΣ", HireDate = DateTime.Parse("1999-09-01"), new Professor LastName="ΞΕΝΑΡΙΟΣ", FirstMidName="ΓΕΩΡΓΙΟΣ", HireDate = DateTime.Parse("2005-09-01"), new Professor LastName="ΞΕΝΑΚΗ", FirstMidName="ΑΝΔΡΙΑΝΑ", HireDate = DateTime.Parse("2005-09-01") ; professors.foreach(s => context.professors.addorupdate(p => p.lastname, s)); context.savechanges();