Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Web site και Linq

Îåêßíçóå áðü ôï ìÝëïò m6s. Τελευταία δημοσίευση από το μέλος George J. Capnias στις 01-08-2010, 19:58. Υπάρχουν 12 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  28-07-2010, 15:33 59546

    Web site και Linq

    1. Υπάρχει τρόπος σε ένα dbml με κώδικα ( .net4) να προσθέσω ένα πίνακα, από την βάση που θέλω χωρίς drag'n'drop! και χωρίς εξωτερικά script ? ( Οπως με dataset πριν κανω .Tables.Add() έχω πάρει τις λεπτομέρειες του πίνακα στην μνήμη για να την καλέσω )
    2. Τελικά αν δεν μπορεί να κάνει αυτή την λεπτομέρεια, με τι μπορώ να αντικαταστήσω το framework (ειδικά τώρα που είναι νωρίς και το ψάχνω το θέμα!) ?!?!?!

    Αυτό που βρίσκω είναι αναφορές για το SQLMetal(;) το οποίο συγχρονίζει, και άλλη λύση να σβήσεις και να ξαναδημιουργήσεις!!!!!! Umbrella

  •  28-07-2010, 15:44 59547 σε απάντηση της 59546

    Απ: Web site και Linq

    Έχεις μπλέξει λίγο τί είναι το Linq2SQL. Δεν είναι ο αντικαταστάτης των DataSet αλλά ένα ORM, το οποίο σημαίνει ότι αντιστοιχίζει κλάσεις σε πίνακες. Αν δεν έχεις μία κλάση, δεν έχει νόημα να συζητάς πως θα την αντιστοιχίσεις σε πίνακα. Αν ξαναγράψεις την ερώτηση σου ως "Υπάρχει τρόπος σε .net4 με κώδικα να προσθέσω μία κλάση?" θα καταλάβεις πόσο παράξενη ακούγεται η ερώτηση.

    Από εκεί και πέρα, μπορείς γενικά να πειράξεις τα metadata ενός DataContext, εφόσον βέβαια υπάρχει η κλάση σου. Αυτό όμως έχει πολύ φασαρία καθώς το Linq2Sql θέλει οι κλάσεις που χρησιμοποιεί να είναι φτιαγμένες με πολύ συγκεκριμένο τρόπο. Ο μόνος τρόπος να γίνει αυτό χωρίς να γράφεις σεντόνια είναι με .... code generation από ένα ήδη υπάρχον dbml.

    Τί ακριβώς θέλεις να κάνεις? Πάω στοίχημα ότι λύνεται πολύ πιο εύκολα από τη δημιουργία κλάσεων και mappings κατά την εκτέλεση της εφαρμογής

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  28-07-2010, 16:07 59548 σε απάντηση της 59547

    Απ: Web site και Linq

    Οκ, καταρχήν σε ευχαριστώ για το χρόνο σου...

    Δεύτερον, φτιάχνω μια απλή εφαρμογή σαν ένα βασικό μοντέλλο και πειραματίζομαι στο asp.net mvc2.

    Λοιπόν, στην χρησιμοποίηση του LINQ εγώ δεν έχω καταλάβει ακόμα ότι είναι προαπαιτούμενο το χτίσιμο κλάσσης και για αυτό θα διαφωνήσω. Μπορεί να προωθείται ώς ORM, αλλά όταν γράφω κώδικα και του λέω τράβα φέρε τις χ,ψ εγγραφές και το κάνει χωρίς πολλά πολλά με καθαρό Select σε ένα System.Data.Linq.Table (δεν θυμίζει System.Data.Table του .net v2 ?) , το LINQ είναι layer/framework για βάσεις. Τώρα αν η microsoft το λέει ORM δικαιώμα της.
    Για παράδειγμα, η δημιουργία ενός dbml με "κλάσεις" τους πίνακες τους ίδιους της βάσης και καλώντας το DataContext για να σου τραβήξει εγγραφές αυτό είναι DataSet με άλλα λόγια να αγαπιόμαστε.

    Αρά, προφανώς ή το LINQ θέλωντας να είναι κάτι που δεν είναι και τόσο, αλλά είναι και κάτι άλλο με φτάνει τώρα στο "αμήν" έχωντας σπαταλήσει την ώρα μου γιατί ανακαλύπτω ότι δεν μπορώ να προσθέσω πίνακα στο dbml με κώδικα. Και αυτό ήταν σημαντικό.

    Οπότε, παρακαλώ αν κάποιος γνωρίζει αν στο dbml γίνεται να προσθέσω System.Data.Linq.Table με κώδικα θα του είμαι υπόχρεος :-)
    Αν πάλι το Linq δεν κάνει τότε μπορώ να κάνω μια web εφαρμογή με dataset από κάτω, αλλά να μην χαλάσω την έννοια του MVC και των 2-3 φορμών που έχω φτιάξει; Δηλαδή το foreach( var n in Model ) θα λειτουργεί;

    Αν ούτε το ένα, ούτε το άλλο, τι εναλλακτική υπάρχει;

    Last : Το χρησιμοποιεί κανείς αυτό --> http://www.plinqo.com/download.ashx  ;
    Επίσης ανακάλυψα και ένα ενδιαφέρον που δυστυχώς στο NerdTutorial δεν το πήρα χαμπάρι(!) ότι το Linq θέλει πολύ ιδιαίτερη μεταχείριση...
    Ιδού... http://devermind.com/linq/a-linq-disconnected-mode-abstract-base-class/


    Ευχαριστώ
  •  28-07-2010, 18:04 59551 σε απάντηση της 59548

    Απ: Web site και Linq

    Πήρα την partial κλάσση και ξεκίνησα manual να γράφω το κώδικα που κρατάει ένα πίνακα ( ο σκοπός είναι να το κάνω με reflection στο τέλος. ) Ετσι έκανα μια partial κλάσση σε ένα άλλο αρχείο και έβαλα το table.
    Παρατήρησα το εξής, ότι στο dbml έχω όλους τους πίνακες  κάπως έτσι :

    [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Company")]
    public partial class Company : INotifyPropertyChanging, INotifyPropertyChanged

    σε ένα πίνακα όμως εχω :
    [global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Department")]
    public partial class Department

    Επειδή δεν είχα κάνει τίποτα με το χέρι στο dbml, και ούτε τώρα κάνω, γιατί έχω αυτή την διαφορά; Οκ, δεν έχει relationship με άλλους πίνακες. Ίσως για αυτό;
  •  30-07-2010, 16:14 59590 σε απάντηση της 59551

    Απ: Web site και Linq

    Αρχικά θα πρέπει να κατανοήσεις πως δουλεύει κάτι, για να μπορέσεις να το πειράξεις να κάνει αυτό που θες:

    • Το .dbml αρχείο είναι ένα metadata αρχείο (ένα xml αρχείο), που περιέχει δεδομένα για το σχήμα της βάσης. Ο εύκολος τρόπος να το τροποποιήσεις είναι μέσα από το γραφικό οδηγό που παρέχει το visual studio. Κατά βάση το .dbml είναι σχεδιασμένο για να παίζει με αυτόν τον οδηγό, και γενικά έχει διευκολύνει τους προγραμματιστές. Δεν είναι κάποιος λιγότερο προγραμματιστής αν το χρησιμοποιεί.
    • Μια βάση δεν είναι κώδικας - οπότε να λες ότι θα χρησιμοποιήσεις reflection για να διαβάσεις την βάση, είναι στην κατηγορία που αναφέρει ο Παναγιώτης πιο επάνω, είναι παράξενη αυτή η ερώτηση. Το σχήμα θέλεις να διαβάσεις της βάσης δυναμικά, και εάν όντως το καταφέρεις και στη συνέχεια υλοποιήσεις ένα μηχανισμό που θα σου γράφει τις κλάσεις, τότε αυτό που κατάφερες, είναι να έχεις φτιάξει μια δική σου έκδοση του LINQ2SQL της Microsoft, μόνο που θα έχεις σπαταλήσει αρκετό χρόνο για να φτιάξεις κάτι λιγότερο από αυτό που ήδη έχεις.

    Βέβαια, πάντα και παντού θα υπάρχουν εξαιρέσεις. Υπάρχουν άνθρωποι που θέλουν να ελέγχουν τα πάντα στον κώδικά τους.

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

    Ο εύκολος τρόπος να φτιάξεις αυτή την κλάση είναι χρησιμοποιώντας το εργαλείο SQLMetal. Προσωπικά, έχω ένα .cmd αρχείο που χρησιμοποιώ για να φτιάχνω τις κλάσεις LINQ2SQL που χρησιμοποιώ:

    @Echo Off
    SETLOCAL
    SET Catalog=%1
    IF "%Catalog%"=="" SET Catalog=AspNetDB
    SET Server=%2
    IF "%Server%"=="" SET Server=.\SQLExpress
    ECHO Server:   %Server%
    ECHO Database: %Catalog%
    "c:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\SqlMetal.exe" /conn:"Data Source=%Server%;Initial Catalog=%Catalog%;Integrated Security=True" /code:dataModel.cs /context:dataModelDataContext /pluralize


    Μετά το όνομα του αρχείου .cmd δίνω το όνομα της βάσης και μετά το όνομα του server που έχει την βάση. Προϋπόθεση είναι να έχει ο λογαριασμός Windows που χρησιμοποιείς πρόσβαση στην βάση. Το SQLMetal φτιάχνει τη κλάση dataModel.cs που μπορείς να κάνεις include στην εφαρμογή σου και να τη πειράξεις όπως θες. Δεν υπάρχει ύπαρξη .dbml αρχείου, και καθένας είναι υπεύθυνος για να συντηρεί την κλάση με τις αλλαγές που γίνονται στο σχήμα της βάσης ή να ξανατρέχει το SQLMetal για να ενημερώνει την κλάση του.

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  30-07-2010, 16:45 59591 σε απάντηση της 59590

    Απ: Web site και Linq

    Γιώργο καταρχήν ευχαριστώ για την εξήγηση και το κώδικα.

    Πρέπει να πώ, ότι δεν είχα την εμπειρία με το Linq και το dbml, kai εχω φάει 2-3 μέρες να ψάχνωμαι. Το πρόβλημα ξεκίνησε , διότι είχαμε ένα software που έκανε αυτό που λέω και θέλουμε να το αφήσουμε πίσω μας και να πάμε σε καλύτερα μοντέλλα ανάπτυξης ( σε πολλά επίπεδα! ).

    Το καλό που είχε το software μας, ήταν ότι μπορεί να διαβάσει κάποιο βασικό σχήμα και μετά, να το επεκτείνεις με νέους πίνακες και συνδέσεις στον κώδικα, κατα συνέπεια στην μνήμη.
    Τι διαφορετικό είχε αυτό; Μια πραγματικά απίστευτη ευκολία, αν είχες ένα πίνακα με 2 πεδία ή 42, δεν σε ενδιέφερε δυναμικά σηκωνώτανε ο πίνακας, και εσύ έπαιρνες τα κλειδιά.
    Τώρα, με το ORM προγραμματισμό, πρέπει να παράγεις version του κώδικα/του πίνακα/των script και γω δεν ξέρω με αποτέλεσμα να τρώς χρόνο στο Μanagement αυτών των πραγμάτων.
    Ισως καλό για μια μεγάλη εταιρεία, όχι όμως για εμάς. Γιατί απλά δεν γίνεται να χεις όλο αυτό τον όγκο ανάλογα με το πρότζεκτ κιόλας.

    Στον παρακάτω κώδικα, εκτελώντας ένα ερώτημα κατευθείαν στην βάση παίρνω ένα αντικείμενο "Department" που είναι partial class και από οσο έχω καταλάβει ουσιαστικά παίζει το ρόλο του interface με τον πίνακα.
    Γιατί το Department μαγικά το έβαλα στο dbml. Αν προσθέσω fields δεν θα τα πάρω όμως.
    1. Γίνεται, χωρίς να μετέχει το dbml στην μέση, να πάρω τόσα πεδία όσα βάλω στο query και να το γυρίσω σε αντικείμενο Πίνακα ίσως;;
    2. Να πάρω το πίνακα και να το στείλω στην σελίδα για προβολή δεδομένων;
    3. Ιδέα θέλω όχι κάποιον να μου γράψει πρόγραμμα ;-) Ιδέα και συμβουλή ότι γίνεται...ή δεν γίνεται.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    IDBrepository rep = new Models.IDBrepository ();
    var db = billingRepository.getDb();
    db.Log = Console.Out;
    db.Connection.Open();
    System.Data.Common.DbTransaction trx = db.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable);
    
    try {
    	db.Transaction = trx;
    	var department = db.ExecuteQuery<Department>("SELECT UPPER(DepartmentId) DepartmentId, Description FROM Department ORDER BY Department.Ordering").ToList();
    	foreach (Department record in department) {
    		record.ToString();
    	}
    	Console.WriteLine("");
    } catch (Exception ex) {
    	Console.WriteLine(ex.ToString());
    	if (trx != null)
    		trx.Rollback();
    } finally {
    
    // Close the connection
    if (db.Connection.State == System.Data.ConnectionState.Open)
    	db.Connection.Close();
    }

    Συγνώμη αν κάνω "λάθος ερωτήσεις" με λάθος τρόπο, δίνω και κώδικα για να χουμε συννενόηση καλύτερη πιστεύω.

    (Πρόσεξα, ότι αν έχω το dbml τουλάχιστον συγχρονισμένο, και δεν πάρω με το query όλα τα πεδία, γεμίζουν όσα ζήτησα στο αντικείμενο....Βέβαια.....τι θα γίνει αν σώσω το αντικείμενο τότε;;; Θα γίνει update και οι τιμές στα πεδία που λείπουν;! )
  •  30-07-2010, 17:36 59592 σε απάντηση της 59591

    Απ: Web site και Linq

    Να θέσουμε μερικά ground rules για να μπορέσουμε να προχωρήσουμε:

    • To .dbml αρχείο δεν είναι απαραίτητο για να μπορέσεις να έχεις Linq2Sql στην εφαρμογή σου. Είναι ένα meta-data αρχείο, που προφανώς είναι προορισμένο για το οδηγό που το συνοδεύει.
    • Από ότι κατάλαβα, δουλεύεις ένα schema βάσης που μεταβάλλεται - δεν μπορείς όλη την ώρα να ασχολείσαι με το να κρατάς up-to-date το .dbml αρχείο και να προσθέτεις ή να αφαιρείς πεδία και πίνακες με την χρήση του wizard. Παρόλα αυτά θες ένα σταθερό τρόπο, για να μπορείς να κάνεις την ανάπτυξη της εφαρμογής σου.
    • Η όλη συζήτηση γίνεται για να βρεθεί ένας τρόπος για να γράφεται/δημιουργείται η κλάση που στη συνέχεια θα χρησιμοποιείς για να έχεις την εύκολη προσπέλαση στην βάση.

    Πες αν συμφωνείς ή που διαφωνείς με τα παραπάνω, ή έχεις κάτι να προσθέσεις για να συνεχίσουμε...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  30-07-2010, 17:45 59593 σε απάντηση της 59592

    Απ: Web site και Linq

    1. Συμφωνώ απόλυτα! :-)

    2. Στον τελευταίο snippet που σας παρέθεσα, είναι ότι ποιο κοντινό έχω βρεί σε αυτή την λογική....
  •  30-07-2010, 21:10 59596 σε απάντηση της 59593

    Απ: Web site και Linq

    Ωραία!

    Προσωπική πρόταση θα ήταν να χρησιμοποιήσεις το SqlMetal εργαλείο:

    • Δεδομένου ότι θέλεις να μπορείς να φτιάχνεις web sites, που δεν έχεις επιλογές για actions κατά το build του project, θα πρότεινα να φτιάχνεις ένα .cmd αρχείο με την απαραίτητη εντολή προς το SqlMetal που με τη σειρά του θα φτιάχνει την κλάση που θα δίνει πρόσβαση στην βάση. Θα έχεις ένα τέτοιο .cmd αρχείο για κάθε σου project.
    • Όποτε απαιτείται, θα τρέχεις αυτό το .cmd αρχεία και θα παράγεται αυτόματα η κλάση - δεν θα υπάρχει ανάγκη για να φτιάξεις οτιδήποτε με το χέρι ή να πειράξεις περαιτέρω την κλάση που δημιουργείται...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  31-07-2010, 00:39 59598 σε απάντηση της 59596

    Απ: Web site και Linq

    Πράγματι, Γιώργο, αύτό που λές μάλλον θα γίνει. Δεν βλέπω άλλη λύση και εγώ. Απλά θα έχω πάντα ένα dbml που θα είναι πάντα ανανεωμένο.

    Έψαχνα να κάνω και το εξής, να δημιουργώ την κλάση on-the-fly την ώρα που τρέχει ο κώδικας, αλλά αυτό με πήγε σε CodeDom.. ? και ....οκ πάει μακρυά.

    Τελευταίο...Επειδή είδα ότι υπάρχει και Linq to dataset, μπορεί να υπάρξει το MVC2 με αυτό; Το δύκτιο έχει πήξει από MVC2 + Linq2sql...Υπάρχει κάποιο link αν είναι δυνατόν; Από microsoft ίσως;

     

  •  31-07-2010, 08:58 59599 σε απάντηση της 59598

    Απ: Web site και Linq

    Καλημέρα,

    Να τα ξαναπάμε από την αρχή - δεν θα έχεις .dbml αρχείο στο project σου με τον τρόπο που σου υπέδειξα - θα υπάρχει μόνο μία κλάση, ένα .cs ή .vb αρχείο ότι επιλέξεις.

    On the fly δημιουργία με κώδικα, μέσα από web site project δεν είναι εύκολη. Μπορεί τεχνικά να γίνει, με την χρήση ενός BuildProvider, αλλά δεν νομίζω ότι θέλεις να εμπλακείς σε κάτι τέτοιο.

    Το Linq2Dataset είναι κάτι το διαφορετικό, από αυτό που συζητάμε μέχρι τώρα - και βέβαια πάμε πίσω στο designer και τις συνεχείς αλλαγές που θα πρέπει να γίνονται. Τα Dataset είναι η παλαιότερη τεχνολογία που υπάρχει από πλευράς ADO.NET αυτή τη στιγμή και δεν θα πρότεινα να φτιάξεις καινούργιες εφαρμογές με αυτή. Ήδη έχει και τρέχει από την έκδοση v1.0 του .NET Framework. Το σίγουρο είναι ότι θα είναι από τις πρώτες που θα αποσυρθούν, όταν έρθει η ώρα.

    Το MVC2 μπορεί να παίξει με οτιδήποτε - δεν υπάρχει κάποιος περιορισμός. Ο συνδυασμός MVC2 και Linq2Sql είναι ότι πιο "ανάλαφρο" υπάρχει - για αυτό και το προτιμούν οι περισσότεροι. Σε σύγκριση με τα web sites, το MVC2 προσφέρει web application project, με την δυνατότητα build events - στην δική σου περίπτωση πχ, θα μπορούσες να βάλεις το .cmd αρχείο στα pre-build events του project σου και χωρίς κάτι παραπάνω με απλό build του project, θα ανανεωνόταν η κλάση που θα σου έδινε πρόσβαση στη βάση και δεν θα "έπρεπε" να ξέρεις πότε έγιναν ή θα γίνουν αλλαγές.

    Η καλύτερη πηγή μάθησης MVC είναι το ίδιο το ASP.NET site. Δεν νομίζω ότι υπάρχουν αλλού συγκεντρωμένα τόσα resources, όσα εκεί...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  31-07-2010, 18:49 59600 σε απάντηση της 59599

    Απ: Web site και Linq

    Αυτό που μου μένει παντως είναι αυτή η ιστορία με την δημιουργία κλάσσης on-the-fly, on-the-run, όπως θές πές το.
    Σε Java δεν έχω ακούσει να γίνεται, και αν δεν γίνεται σίγουρα κάποια στιγμή θα υπάρξει. Δεν είναι πολύ mainstream αλλά με βάση το ψάξιμο, σκέψου ένα σύστημα που θα μπορούσε με δεδομένα από μια πηγή, να παράγει δικές του κλάσσεις object και να δίνει πίσω στον developer το απότελεσμα αυτό. Σαν visual designer ok υπάρχει από UML, αλλά όχι πιά γιατί κάνω κλίκ και βγάζω απο UML, τον κώδικα αλλά γιατί έχω live data.
    Δεν ξερώ αν γίνεται, δεν ξέρω αν το έχουν κάνει ήδη αλλά προκαλεί την φαντασία :-P

    Θα σου πώς επίσης τελευταίο ότι έστησα την δουλειά με το dbmetal ώστε από κάτω έχω mysql. Και το λέω με λίγο περηφάνια γιατί και αυτό ήταν καλός πονοκέφαλος.

    Ok, σε ευχαριστώ πολύ για τις συμβουλές.
    :-)
  •  01-08-2010, 19:58 59602 σε απάντηση της 59600

    Απ: Web site και Linq

    Χαίρομαι που δούλεψε για σένα...

    Αλλά, έχω τις επιφυλάξεις μου ότι και οι δύο μιλάγαμε για διαφορετικά πράγματα: Sad

    • Web site εγώ εννοούσα το Web Site project (βλ άρθρο που συγκρίνει Web Site project vs Web Application project) του Visual Studio, και όταν λέγαμε Linq2Sql εγώ εννοούσα το Data Access Framework της Microsoft που περιέχεται στο NET Framework.
    • Εσύ αναφερόσουν γενικά στην έννοια web site, και για Linq2Sql στην ικανότητα της Linq να παράγει SQL κώδικα. Και από το web site και Linq2Sql, έφτασες στο MVC2 και στο DBLinq.

    Θα μπορούσα να είμαι πιο εύστοχος στις απαντήσεις μου, αν ήσουν πιο ξεκάθαρος από την αρχή...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems