|
Îåêßíçóå áðü ôï ìÝëïò m6s. Τελευταία δημοσίευση από το μέλος George J. Capnias στις 01-08-2010, 19:58. Υπάρχουν 12 απαντήσεις.
-
28-07-2010, 15:33
|
-
28-07-2010, 15:44
|
|
Έχεις μπλέξει λίγο τί είναι το Linq2SQL. Δεν είναι ο αντικαταστάτης των DataSet αλλά ένα ORM, το οποίο σημαίνει ότι αντιστοιχίζει κλάσεις σε πίνακες. Αν δεν έχεις μία κλάση, δεν έχει νόημα να συζητάς πως θα την αντιστοιχίσεις σε πίνακα. Αν ξαναγράψεις την ερώτηση σου ως "Υπάρχει τρόπος σε .net4 με κώδικα να προσθέσω μία κλάση?" θα καταλάβεις πόσο παράξενη ακούγεται η ερώτηση.
Από εκεί και πέρα, μπορείς γενικά να πειράξεις τα metadata ενός DataContext, εφόσον βέβαια υπάρχει η κλάση σου. Αυτό όμως έχει πολύ φασαρία καθώς το Linq2Sql θέλει οι κλάσεις που χρησιμοποιεί να είναι φτιαγμένες με πολύ συγκεκριμένο τρόπο. Ο μόνος τρόπος να γίνει αυτό χωρίς να γράφεις σεντόνια είναι με .... code generation από ένα ήδη υπάρχον dbml.
Τί ακριβώς θέλεις να κάνεις? Πάω στοίχημα ότι λύνεται πολύ πιο εύκολα από τη δημιουργία κλάσεων και mappings κατά την εκτέλεση της εφαρμογής
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
28-07-2010, 16:07
|
-
m6s
-
-

-
Μέλος από τις 01-06-2007
-
Αθήνα
-
Δημοσιεύσεις 151
-
-
|
Οκ, καταρχήν σε ευχαριστώ για το χρόνο σου...
Δεύτερον, φτιάχνω μια απλή εφαρμογή σαν ένα βασικό μοντέλλο και πειραματίζομαι στο 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
|
-
30-07-2010, 16:14
|
|
Αρχικά θα πρέπει να κατανοήσεις πως δουλεύει κάτι, για να μπορέσεις να το πειράξεις να κάνει αυτό που θες:
- Το .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.
|
|
-
30-07-2010, 16:45
|
-
m6s
-
-

-
Μέλος από τις 01-06-2007
-
Αθήνα
-
Δημοσιεύσεις 151
-
-
|
Γιώργο καταρχήν ευχαριστώ για την εξήγηση και το κώδικα. Πρέπει να πώ, ότι δεν είχα την εμπειρία με το 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
|
|
Να θέσουμε μερικά ground rules για να μπορέσουμε να προχωρήσουμε:
- To .dbml αρχείο δεν είναι απαραίτητο για να μπορέσεις να έχεις Linq2Sql στην εφαρμογή σου. Είναι ένα meta-data αρχείο, που προφανώς είναι προορισμένο για το οδηγό που το συνοδεύει.
- Από ότι κατάλαβα, δουλεύεις ένα schema βάσης που μεταβάλλεται - δεν μπορείς όλη την ώρα να ασχολείσαι με το να κρατάς up-to-date το .dbml αρχείο και να προσθέτεις ή να αφαιρείς πεδία και πίνακες με την χρήση του wizard. Παρόλα αυτά θες ένα σταθερό τρόπο, για να μπορείς να κάνεις την ανάπτυξη της εφαρμογής σου.
- Η όλη συζήτηση γίνεται για να βρεθεί ένας τρόπος για να γράφεται/δημιουργείται η κλάση που στη συνέχεια θα χρησιμοποιείς για να έχεις την εύκολη προσπέλαση στην βάση.
Πες αν συμφωνείς ή που διαφωνείς με τα παραπάνω, ή έχεις κάτι να προσθέσεις για να συνεχίσουμε...
George J.
|
|
-
30-07-2010, 17:45
|
-
30-07-2010, 21:10
|
|
Ωραία!
Προσωπική πρόταση θα ήταν να χρησιμοποιήσεις το SqlMetal εργαλείο:
- Δεδομένου ότι θέλεις να μπορείς να φτιάχνεις web sites, που δεν έχεις επιλογές για actions κατά το build του project, θα πρότεινα να φτιάχνεις ένα .cmd αρχείο με την απαραίτητη εντολή προς το SqlMetal που με τη σειρά του θα φτιάχνει την κλάση που θα δίνει πρόσβαση στην βάση. Θα έχεις ένα τέτοιο .cmd αρχείο για κάθε σου project.
- Όποτε απαιτείται, θα τρέχεις αυτό το .cmd αρχεία και θα παράγεται αυτόματα η κλάση - δεν θα υπάρχει ανάγκη για να φτιάξεις οτιδήποτε με το χέρι ή να πειράξεις περαιτέρω την κλάση που δημιουργείται...
George J.
|
|
-
31-07-2010, 00:39
|
-
m6s
-
-

-
Μέλος από τις 01-06-2007
-
Αθήνα
-
Δημοσιεύσεις 151
-
-
|
Πράγματι, Γιώργο, αύτό που λές μάλλον θα γίνει. Δεν βλέπω άλλη λύση και εγώ. Απλά θα έχω πάντα ένα dbml που θα είναι πάντα ανανεωμένο.
Έψαχνα να κάνω και το εξής, να δημιουργώ την κλάση on-the-fly την ώρα που τρέχει ο κώδικας, αλλά αυτό με πήγε σε CodeDom.. ? και ....οκ πάει μακρυά.
Τελευταίο...Επειδή είδα ότι υπάρχει και Linq to dataset, μπορεί να υπάρξει το MVC2 με αυτό; Το δύκτιο έχει πήξει από MVC2 + Linq2sql...Υπάρχει κάποιο link αν είναι δυνατόν; Από microsoft ίσως;
|
|
-
31-07-2010, 08:58
|
|
Καλημέρα,
Να τα ξαναπάμε από την αρχή - δεν θα έχεις .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.
|
|
-
31-07-2010, 18:49
|
-
01-08-2010, 19:58
|
|
Χαίρομαι που δούλεψε για σένα...
Αλλά, έχω τις επιφυλάξεις μου ότι και οι δύο μιλάγαμε για διαφορετικά πράγματα: 
- 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.
|
|
|
|
|